如何迭代收集和改变价值

时间:2013-10-04 11:57:12

标签: c# loops foreach

我知道这是一个愚蠢的问题,因为你不能在循环中修改循环集合,但我确实需要更改它。我知道我不能改变引用的对象,但我不知道如何做到这一点。

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

2 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:0)

使用for循环而不是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);
        }
    }
}