我有一个类型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
是我的词典。
答案 0 :(得分:10)
这是捕获的迭代器问题。
尝试:
foreach (string tmp in typelist)
{
string type = tmp;
(其余未改变)
或者,我会在添加期间评估表达式,即。在.Add:
中执行.ToList() serialLists.Add(type, lst.ToList());
第二种选择可能总体上更有效,尽管它确实强制评估可能永远不需要的thigs。
答案 1 :(得分:6)
原因是你的IEnumerable<string>
序列没有被急切地填充,但是按需, 后{em} 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);
}