Почему именно словарь.Добавить перезапись всех словарей?

у меня есть словарь типа Dictionary<string, IEnumerable<string>> и список строковых значений. По какой-то причине каждый раз, когда я добавляю, каждое значение в словаре перезаписывается. Я совершенно не понимаю, почему это происходит. Я убедился, что это не ссылочная проблема, объявляющая и инициализирующая объект IEnumberable в цикле, чтобы его область не выходила за пределы одной итерации, и она все еще делает это. Вот мой код:

foreach (string type in typelist)
{
    IEnumerable<string> lst = 
        from row in root.Descendants()
        where row.Attribute("serial").Value.Substring(0, 3).Equals(type)
        select row.Attribute("serial").Value.Substring(3).ToLower();

    serialLists.Add(type, lst);
}

здесь typelist это IEnumerable<string>, root - это XElement и serialLists мой словарь.

2 ответов


это проблема захваченного итератора.

попробуй:

foreach (string tmp in typelist)
{
   string type = tmp;

(остальное без изменений)

кроме того, я бы оценил выражение во время добавления, т. е. сделать .Список() в .Добавить:

    serialLists.Add(type, lst.ToList());

второй вариант, вероятно, более эффективен в целом, хотя он заставляет оценивать thigs, которые в противном случае никогда не понадобятся.


причина в том, что ваш IEnumerable<string> последовательности заполняются не с нетерпением, а по требованию,после на foreach цикл завершил бы все свои итерации. Таким образом, когда любой IEnumerable<string> последовательность перечня type переменная всегда будет иметь значение последнего элемента typelist.

вот один простой способ исправить это:

foreach (string type in typelist)
{
    string typeCaptured = type;

    IEnumerable<string> lst = 
        from row in root.Descendants()
        where row.Attribute("serial").Value.Substring(0, 3).Equals(typeCaptured)
        select row.Attribute("serial").Value.Substring(3).ToLower();

    serialLists.Add(typeCaptured, lst);
}