Проблема со словарем <строка, строка> - PullRequest
0 голосов
/ 27 июля 2011

Кто-нибудь может мне помочь?

У меня был простой код:

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 ]

4 голосов
/ 27 июля 2011

Ошибка говорит: «[ArgumentNullException: значение не может быть нулевым. Имя параметра: ключ]»

Значение для:

node.Attributes["Titulo"].InnerText

, по-видимому, равно нулю вВ некоторых случаях это запрещено.Ключ для словарной записи не может быть нулевым.

1 голос
/ 27 июля 2011

Возможно, узел "Titulo" в некоторых случаях пуст.Вы должны проверить это, прежде чем хотите добавить его в свой словарь, потому что свойство ключа не может иметь пустое значение.

Вот пример, чтобы предотвратить это.

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));
    }
}
0 голосов
/ 02 февраля 2016

Скажу просто, у меня была такая же ошибка, Value cannot be null, при использовании ToDictionary() и два значения ключа были одинаковыми.

Я не осознавал этого и нашел сообщение об ошибке немного вводящим в заблуждение, поскольку ни одно из моих значений не было нулевым.

Мое решение (применение его к вашей проблеме) состояло бы воригинальный код:

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 <> в словарь.

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

Это немного больше работы, но это удобный способ проверить Dictionary проблемывместо ожидания возникновения исключения, если есть проблема с вашими данными.

0 голосов
/ 27 июля 2011

Вы уверены, что всегда имеете значение в своем атрибуте node.Attributes["Titulo"].InnerText.Если нет, у вас будет ArgumentNullException.Вы не можете иметь нулевое значение для ключа в словаре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...