为什么我的匿名方法不能在循环中工作?

mag*_*low 2 .net c# linq lambda

此函数应该在IEnumerable <Order>上设置降序编号,但它不起作用.谁能告诉我它有什么问题?

private void orderNumberSetter(IEnumerable<Order> orders)
{
    var i = 0;            

    Action<Order, int> setOrderNumber = (Order o, int count) =>
    {
        o.orderNumber = i--;
    };

    var orderArray = orders.ToArray();
    for (i = 0; i < orders.Count(); i++)
    {
        var order = orderArray[i];
        setOrderNumber(order, i);
    }            
}
Run Code Online (Sandbox Code Playgroud)

Bro*_*ass 9

您正在重新使用i作为循环变量并isetOrderNumberlambda中进行修改i- 不要修改- 它不清楚您的意图,可能如下:

Action<Order, int> setOrderNumber = (Order o, int count) =>
{
    o.orderNumber = count;
};
Run Code Online (Sandbox Code Playgroud)

如果是上面的情况你可以实现那么多,但更容易,你的代码似乎不必要地复杂,即:

for (i = 0; i < orderArray.Length; i++)
{
    orderArray[i].orderNumber = i;
} 
Run Code Online (Sandbox Code Playgroud)

甚至更简单,而不必创建一个数组:

int orderNum = 0;
foreach(var order in orders)
{
   order.orderNumber = orderNum++;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

要设置降序编号,您可以先确定订单数量,然后从那里向后退货:

int orderNum = orders.Count();
foreach(var order in orders)
{
   order.orderNumber = orderNum--;
}
Run Code Online (Sandbox Code Playgroud)

以上将按降序生成一个基于订单的编号.另一种更直观且可能更容易维护的方法是以相反的顺序遍历枚举:

int orderNum = 0;
foreach(var order in orders.Reverse())
{
   order.orderNumber = orderNum++;
}
Run Code Online (Sandbox Code Playgroud)