在 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 循环中操作列表项会影响所有其他项

这可能没有导致您的问题,但您的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。在这里,您将使用过滤列表的索引修改原始列表。

最好使用 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);
}