我遇到了一个奇怪的问题,但我的身边肯定有一个错过。检查一下你是否可以指出这一点。我在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
被添加到每次迭代中的所有量子中,而不仅仅是我们在循环体中处理的那个量子。我怀疑引用混乱。
有什么指针吗?
由于
答案 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,或者至少实例化新对象并单独复制值(如果它们是值类型则是安全的),如果这是您尝试的那样。