【问题标题】:Changing collection inside foreach更改 foreach 中的集合
【发布时间】:2013-01-19 09:52:30
【问题描述】:

这是我的代码:

foreach (OrderItem item in OrderInfo.order)
{
     orderItemViews.Single(i => i.numericUpDown.Name == item.id.ToString()).numericUpDown.Value = item.count;
}

它给出了一个例外。
我知道我无法更改 foreach
中的集合 如何更改此代码以使其正常工作?最好是 LINQ 代码。

异常表示“集合已修改”。抱歉无法提供真正的异常消息,因为它是非英语的

对不起,伙计们。我发现收藏在哪里发生了变化。它在 *numericUpDown_ValueChanged* 处理程序中。反正我有答案。谢谢

【问题讨论】:

  • 当您在此循环中更改 OrderInfo.order 集合时?据我了解,您只需更新您的界面...
  • 有什么例外? orderItemViews 的类型是什么,有哪些成员?
  • 这段代码是否在 UI 线程之外运行?
  • 可能你会写出你遇到了什么类型的异常?
  • 我看到 OrderInfo.order 没有改变。但无论如何我得到了这个例外。我不知道为什么

标签: c# linq


【解决方案1】:

你可以使用ToList(),像这样:

foreach (OrderItem item in OrderInfo.order.ToList())
{
     orderItemViews.Single(i => i.numericUpDown.Name == item.id.ToString()).numericUpDown.Value = item.count;
}

或者使用普通的for循环:

for (int i = 0 ; i < OrderInfo.order.Count; i++)
{
     OrderItem item = OrderInfo.order[i];
     orderItemViews.Single(i => i.numericUpDown.Name == item.id.ToString()).numericUpDown.Value = item.count;
}

提示:性能方面,最好使用第二种方式。

【讨论】:

  • 您确定这有帮助吗?您在哪里看到 odrer 收藏更改?
  • @HamletHakobyan 可能是Value setter 的副作用——我们不看代码就无法知道。但是,这是枚举数失效问题的解决方案。 for 循环肯定会解决这个问题。
  • @acrilige 你不知道。他可能正在将集合更改为Value setter。不看完整代码你就无法知道。
【解决方案2】:

当我需要修改集合时,这就是我所做的。

foreach (OrderItem item in OrderInfo.order.ToList())
{
     ...
}

创建一个副本。枚举副本,但更新原始副本。

【讨论】:

  • 你确定这有帮助吗?您在哪里看到 odrer 收藏更改?
【解决方案3】:

您可以使用扩展的 ToEach 静态方法:

public delegate void ToEachTransformAction<T>(ref T Telement);

[Extension()]
public static void ToEach<T>(Generic.IList<T> thislist, ToEachTransformAction<T> Transform)
    {
        for (var n = 0; n < thislist.Count; n++)
        {
            Transform.Invoke(thislist(n));
        }
    }

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 2013-10-09
    • 2011-12-06
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多