2013-01-19 51 views
1

這裏收集是我的代碼:更改裏面的foreach

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

它給出了一個例外。
我知道我不能更改內部的集合foreach
如何更改此代碼以使其工作?最重要的是,如果它是LINQ代碼。

異常說「集合已被修改」。對不起,不能提供異常的真實信息,因爲它在非英語

對不起。我發現收藏在哪裏變化。它在* numericUpDown_ValueChanged *處理程序中。無論如何,我有一個答案。謝謝

+2

?據我瞭解,你只是更新你的界面... – acrilige

+0

什麼是例外? orderItemViews的類型是什麼,它有什麼成員? –

+0

此代碼是否在UI線程之外運行? –

回答

7

您可以使用ToList(),就像這樣:

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

或使用正常的循環:

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; 
} 

提示:明智的性能,這是更好地使用第二種方式。

+2

你確定這可以幫助嗎?你在哪裏看到'odrer'收藏變化? –

+0

@HamletHakobyan可能,這是'Value'制定者的一個副作用 - 我們無法知道沒有看到代碼。但是,這是枚舉器失效問題的解決方案。 'for'循環肯定會解決這個問題。它的工作原理是 –

+0

。謝謝 – Novikoff

2

這就是我所做的,當我需要修改集合時。

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

創建副本。枚舉副本,但更新原始副本。

+1

你確定這可以幫助嗎?你在哪裏看到'odrer'收藏變化? –

0

您可以使用擴展ToEach靜態方法:當你改變這個循環裏你OrderInfo.order收集

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)); 
     } 
    }