在for循环中操作列表项会影响所有其他项

时间:2016-02-24 05:26:33

标签: c# for-loop collections foreach

我遇到了一个奇怪的问题,但我的身边肯定有一个错过。检查一下你是否可以指出这一点。我在foreach循环中执行此操作但后来切换到for循环以避免出现歧义,但仍然失败。

// Update each quantum.
for (int i = 0; i < Quantums.Where(a => a.Language != "en-US").Count(); i++)
{
    Quantums[i].ListQType.AddRange(AddedOnes);
}

发生的事情是列表AddedOnes被添加到每次迭代中的所有量子中,而不仅仅是我们在循环体中处理的那个量子。我怀疑引用混乱。 有什么指针吗?

由于

2 个答案:

答案 0 :(得分:1)

调用Quantums[i]是个问题。已过滤的列表将具有不同的索引,而原始列表将具有不同的索引i。在这里,您将使用已过滤列表的索引修改原始列表。

更好地使用for-each lambda表达式或for-each循环。

Quantums.Where(a => a.Language != "en-US").ForEach(x=>x.ListQType.AddRange(AddedOnes));

foreach(var item in Quantums.Where(a => a.Language != "en-US").)
{
   item.ListQType.AddRange(AddedOnes);
}

答案 1 :(得分:1)

这可能不会导致您的问题,但您的for循环条件似乎有误。如果您要在条件上执行Where(),则应确保您在for循环中处理的列表处于相同条件。

  

我怀疑引用混乱

然而,尽管如此,正如您所怀疑的那样,您的每个Quantum似乎都指向同一个对象。这可能与您创建每个对象的方式有关。我怀疑你做的事情如下:

Quantum q1 = new Quantum(){Property1=something /*etc*/};
Quantum q2 = q1; // assuming your Quantums is a list of Quantum

或者只是在ListQType的每个元素上复制引用的Quantums

您应该查看deep copying,或者至少实例化新对象并单独复制值(如果它们是值类型则是安全的),如果这是您尝试的那样。