2013-10-04 85 views
-5

我知道這是一個愚蠢的問題,因爲您不能在循環中修改循環集合,但我確實需要更改它。我知道我不能改變被引用的對象,但我不知道該怎麼做。如何迭代收集和更改值

var orders = _orderService.GetOrders(o => !o.Deleted && 
              o.OrderStatus != OrderStatus.Cancelled && 
              o.OrderStatus != OrderStatus.Complete); 
foreach (var order in orders) 
{ 
    if (order.PaymentStatus == PaymentStatus.Paid) 
    { 
     if (order.ShippingStatus == ShippingStatus.ShippingNotRequired || order.ShippingStatus == ShippingStatus.Delivered) 
     {  
      var tempOrder = _orderService.GetOrderById(order.Id);     
      SetOrderStatus(tempOrder , OrderStatus.Complete, true); 
     } 
    } 
} 

我總是得到一個錯誤。

更新:我改變了這個

var orders = _orderService.GetOrders(o => !o.Deleted && 
         o.OrderStatus != OrderStatus.Cancelled && o.OrderStatus != OrderStatus.CompletE); 

      List<int> orderIndex = new List<int>(); 
      orders.ToList().ForEach(x => orderIndex.Add(x.Id)); 

      foreach(var index in orderIndex) 
      { 
       var order = _orderService.GetOrderById(index); 
       if (order.PaymentStatus == PaymentStatus.Paid) 
       { 
        if (order.ShippingStatus == ShippingStatus.ShippingNotRequired || order.ShippingStatus == ShippingStatus.Delivered) 
        { 

         SetOrderStatus(order, OrderStatus.Complete, true); 
        } 
       } 
      } 
+3

你得到哪些錯誤? –

+0

'因爲你不能在循環中更改值......呃,什麼? – walther

+0

@walther我認爲他指的是['「集合已被修改;枚舉操作可能不會執行]'](http://stackoverflow.com/q/3551696/2246344)錯誤。 – Sam

回答

0

使用的循環,而不是foreach循環

for(int i=0; i<orders.Count; i++) 
{ 
    if (orders[i].PaymentStatus == PaymentStatus.Paid) 
    { 
     if (orders[i].ShippingStatus == ShippingStatus.ShippingNotRequired || orders[i].ShippingStatus == ShippingStatus.Delivered) 
     {  
      var tempOrder = _orderService.GetOrderById(orders[i].Id);     
      SetOrderStatus(tempOrder , OrderStatus.Complete, true); 
     } 
    } 
} 
+0

@Yosi現在被編輯了,所以我刪除了我的帖子,但即使答案可能很短,我認爲寫更多的東西是個好主意。回答如下:「寫入循環」不是一個好主意 – wudzik

+0

他的代碼不會修改'訂單' –

+0

@JohnSaunders - 您不必編寫代碼,問問題,答案即可解決問題單詞,這阻止了代碼做它應該做的。 –

3

嘗試

int count = orders.Count; // the length of the collect : may need a different method for different collection types. 
for(int i = 0; i < count; i++) 
{ 
    var current = orders[i]; 
    // do stuff with current. 
} 
+2

他的代碼不會修改'order' –

+0

你的答案似乎假設他的問題是「在迭代過程中無法更改範圍對象」。但是如果他沒有改變它,那麼這不是問題,你的答案不是解決方案。 –

+0

但是這個調用不使用'order'。使用'tempOrder'不會改變'訂單' –