为什么字典.添加覆盖我的字典中的所有项目
本文关键字:字典 项目 我的 添加 覆盖 为什么 | 更新日期: 2023-09-27 18:31:57
我有一个类型为 Dictionary<string, IEnumerable<string>>
的字典和一个字符串值列表。出于某种原因,每次我执行 Add 时,字典中的每个值都会被覆盖。我完全不知道为什么会发生这种情况。我确保在循环中声明和初始化 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
是我的字典。
这是一个捕获的迭代器问题。
尝试:
foreach (string tmp in typelist)
{
string type = tmp;
(其余不变)
或者,我会在添加期间评估表达式,即执行 .ToList() 在 .加:
serialLists.Add(type, lst.ToList());
第二种选择总体上可能更有效,尽管它确实迫使评估可能永远不需要的盗贼。
原因是您的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);
}