6

我有一个类型字典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是一个XElementserialLists是我的字典。

4

2 回答 2

10

这是一个捕获的迭代器问题。

尝试:

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

(其余不变)

或者,我会在添加期间评估表达式,即在 .Add 中执行 .ToList():

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

第二个选项总体上可能更有效,尽管它确实强制评估可能永远不需要的东西。

于 2012-04-23T17:07:17.713 回答
6

原因是您的序列没有被急切地填充,而是在循环完成所有迭代之后IEnumerable<string>按需填充。因此,当枚举任何序列时,变量将始终具有 中最后一个元素的值。foreachIEnumerable<string>typetypelist

这是修复它的一种简单方法:

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);
}
于 2012-04-23T17:08:12.800 回答