2013-10-04 50 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'不会改变'订单' –