此函数应该在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);
}
}
答案 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。它还可以很好地描述您的代码在帖子中要做的事情,包括您的预期结果,以及您当前的示例如何不符合它们。不要让你的非工作实例单独解释你想要的东西,它只向我们展示了你不想要的东西。