Dictionary <string,string =“”> </string,>的问题

时间:2011-07-26 22:00:55

标签: c# exception dictionary

任何人都可以帮助我吗?

我有一个简单的代码:

private void ObterRelatorios(string id) { 
    var relatorios = new Dictionary<string, string>();

    var xml = new XmlDocument();

    xml.Load("my_path");

    foreach (XmlNode node in relatoriosStaticos.DocumentElement.ChildNodes)
        relatorios.Add(node.Attributes["Titulo"].InnerText, string.Concat(node.Attributes["Url"].InnerText, id));
}

我的xml非常简单,有5个节点,并且总是相同。

这很奇怪,因为有时候有效,有时候不行。

这是我抛出异常时得到的

错误详细信息:

Exception of type 'System.Web.HttpUnhandledException' was thrown.

完整筹码:

[ArgumentNullException: Value cannot be null.
Parameter name: key]
at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Collections.Generic.Dictionary.Insert(TKey key, TValue value, Boolean add)
at System.Collections.Generic.Dictionary.Add(TKey key, TValue value)

4 个答案:

答案 0 :(得分:4)

错误显示“[ArgumentNullException:Value不能为null。参数名称:key]”

值:

node.Attributes["Titulo"].InnerText

在某些情况下显然为空,这是不允许的。字典条目的键不能为空。

答案 1 :(得分:1)

在某些情况下,“Titulo”节点可能是空的。您必须先检查它,然后才能将其添加到Dictionary中,因为Key-Property不能具有空值。

这是一个阻止它的例子。

foreach (XmlNode node in relatoriosStaticos.DocumentElement.ChildNodes)
{
    if (node.Attributes["Titulo"].InnerText == string.Empty)
    {
        continue;
    }
    else
    {
        relatorios.Add(node.Attributes["Titulo"].InnerText,
            string.Concat(node.Attributes["Url"].InnerText, id));
    }
}

答案 2 :(得分:0)

您确定自己的node.Attributes["Titulo"].InnerText属性总是有价值吗?如果没有,你将有ArgumentNullException。 “字典”中的键不能为空值。

答案 3 :(得分:0)

只是说,在使用Value cannot be null时,我有同样的错误ToDictionary(),其中两个Key值相同。

我没有意识到这一点,并发现错误信息有点误导,因为我的值都没有。

我的解决方案(将其应用于您的问题)将采用您的原始代码:

foreach (XmlNode node in relatoriosStaticos.DocumentElement.ChildNodes)
        relatorios.Add(node.Attributes["Titulo"].InnerText, string.Concat(node.Attributes["Url"].InnerText, id));

并将其分为两部分。

首先,使用键和列表填充List<>变量。您打算将值放入Dictionary

的值
public class KeysAndValues
{
    public string Key;
    public string Value;

    public override string ToString()
    {
       return string.Format("{0}: {1}", Key, Value);
    }
}

List<KeysAndValues> dict = new List<KeysAndValues>();
foreach (XmlNode node in relatoriosStaticos.DocumentElement.ChildNodes)
{
    dict.Add(new KeysAndValues() 
    {
        Key = node.Attributes["Titulo"].InnerText,
        Value = string.Concat(node.Attributes["Url"].InnerText, id)
    });
}

接下来,获取代码以检查NULL值和重复的Key值。

如果一切顺利,那么我们可以转换List&lt;&gt;进入字典。

foreach (KeysAndValues kv in dict)
{
    relatorios.Add(kv.Key, kv.Value);
}

它还有一点工作,但如果您的数据存在问题,这是检查Dictionary问题的一种巧妙方法,而不是等待异常发生。