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

时间:2012-01-13 21:54:52

标签: c# .net 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);
    }            
}

4 个答案:

答案 0 :(得分:9)

您正在重复使用i作为循环变量并在i lambda中修改setOrderNumber - 请勿修改i - 不清楚您的意图做,可能如下:

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

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

for (i = 0; i < orderArray.Length; i++)
{
    orderArray[i].orderNumber = i;
} 

甚至更简单,无需创建数组:

int orderNum = 0;
foreach(var order in orders)
{
   order.orderNumber = orderNum++;
}

修改

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

int orderNum = orders.Count();
foreach(var order in orders)
{
   order.orderNumber = orderNum--;
}

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

int orderNum = 0;
foreach(var order in orders.Reverse())
{
   order.orderNumber = orderNum++;
}

答案 1 :(得分:2)

我同意BrokenGlass,你正陷入无限循环。

您可以使用foreach实现相同的目标:

private void orderNumberSetter(IEnumerable<Order> orders)
{
    var count = orders.Count();

    orders.ToList().ForEach(o =>
    {
         o.orderNumber = count--;
    });
}

答案 2 :(得分:2)

我会尝试使用此代码,在通过数组

枚举时递减i
private void orderNumberSetter(IEnumerable<Order> orders)
{
    int i = orders.Count();
    foreach (Order order in orders.ToArray())
    {
        order.orderNumber = --i;
    }            
}

答案 3 :(得分:2)

虽然很难分辨你的尝试做什么,但是你不打算继续引用相同的变量i,这是什么导致无限循环。 这是我认为你想要的另一个例子

IEnumerable<Order> reversed = orders.ToArray(); //To avoid editing the original
reversed.Reverse();
int orderNumber = 0; 
foreach (Order order in reversed)
{
    order.orderNumber = orderNumber++;
}

我建议您修改标题。你的标题描述了你的问题,我确定你不想要一个破碎的C#功能,因为你已经有了一个:P。它还可以很好地描述您的代码在帖子中要做的事情,包括您的预期结果,以及您当前的示例如何不符合它们。不要让你的非工作实例单独解释你想要的东西,它只向我们展示了你不想要的东西。