Почему именно словарь.Добавить перезапись всех словарей?
у меня есть словарь типа 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);
}