为什么不;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);
}
}
您正在重新使用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。在文章中彻底描述你的代码要做什么也很好,包括你的预期结果是什么,以及你当前的示例如何达不到这些结果。不要让你的非工作例子单独解释你想要什么,它只向我们展示了你不想要的一个例子。