在 for 循环中操作列表项会影响所有其他项
本文关键字:影响 其他 列表 for 循环 操作 | 更新日期: 2023-09-27 18:35:53
我遇到了一个奇怪的问题,但我这边肯定有一个失误。检查您是否可以指出这一点。我在循环中执行此操作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
被添加到每次迭代中的所有量子中,而不仅仅是添加到我们在循环体中处理的量子中。我怀疑引用混乱。有什么指示吗?
谢谢
这可能没有导致您的问题,但您的for
循环的状况似乎有问题。如果要对条件进行Where()
,则应确保在 for 循环中处理的列表处于相同的条件。
我怀疑引用混乱
然而,尽管如此,正如你所怀疑的那样,你的每个量子似乎都引用了同一个对象。这可能是您创建每个对象的方式。我怀疑你在做这样的事情:
Quantum q1 = new Quantum(){Property1=something /*etc*/};
Quantum q2 = q1; // assuming your Quantums is a list of Quantum
或者它可能只是在Quantums
的每个元素上复制的引用ListQType
。
您应该研究深度复制,或者至少实例化新对象并单独复制值(如果它们是值类型,则安全),如果这是您要执行的操作。
调用Quantums[i]
是问题所在。过滤列表将具有不同的索引,原始列表将具有不同的索引i
。在这里,您将使用过滤列表的索引修改原始列表。
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);
}