为什么不;t我的匿名方法循环工作

本文关键字:方法 循环 工作 我的 为什么不 | 更新日期: 2023-09-27 18:20:11

此函数应该在IEnumerable<订单>,但它不起作用。有人能告诉我它怎么了吗?

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

为什么不;t我的匿名方法循环工作

您正在重新使用i作为循环变量,而i在您的setOrderNumber lambda中被修改-不要修改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++;
}

我同意BrokenGlass的观点,你正在进入一个无限循环。

使用foreach:可以实现同样的效果

private void orderNumberSetter(IEnumerable<Order> orders)
{
    var count = orders.Count();
    orders.ToList().ForEach(o =>
    {
         o.orderNumber = count--;
    });
}

我会尝试这个代码,当它通过数组枚举时,它会递减i

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

虽然很难判断您的尝试要做什么,但很有可能您并不想一直引用同一个变量i,这就是导致无限循环的原因。这是我认为你想要的另一个例子

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

我建议编辑一下你的标题。你的标题描述了你的问题,我相信你不想要Broken C#函数,因为你已经有了一个:P。在文章中彻底描述你的代码要做什么也很好,包括你的预期结果是什么,以及你当前的示例如何达不到这些结果。不要让你的非工作例子单独解释你想要什么,它只向我们展示了你不想要的一个例子。