【问题标题】:Manipulating list item in for loop affects all other items在 for 循环中操作列表项会影响所有其他项
【发布时间】:2016-06-06 06:12:07
【问题描述】:

我遇到了一个奇怪的问题,但我身边肯定有一个失误。检查您是否可以指出这一点。我在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 被添加到每次迭代中的所有量子中,而不仅仅是我们在循环体中处理的那个。我怀疑引用混乱。 有什么指点吗?

谢谢

【问题讨论】:

    标签: c# for-loop collections foreach


    【解决方案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);
    }
    

    【讨论】:

    • 已经尝试了 Lambda for-each,我想我需要检查一下为什么每个量程的 ListQType 都指向相同的东西。
    【解决方案2】:

    这可能不会导致您的问题,但您的 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,或者至少实例化新对象并单独复制值(如果它们是值类型,则安全)如果这是您尝试做的事情。

    【讨论】:

    • 这种情况是在创建 Quantums 列表的地方,在循环中分配了相同的 ListQtype。因此所有的quantum.ListQType 都指向同一个位置。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2013-03-21
    相关资源
    最近更新 更多