2012-01-13 68 views
2

此函数应该设置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); 
    }    
} 
+2

你能告诉我们它不起作用吗? – BoltClock 2012-01-13 21:55:36

+1

我的猜测是'o.orderNumber = i - '这行''好像会让你陷入无限循环。 – 2012-01-13 21:58:28

回答

9

您重新使用i作为循环变量和isetOrderNumber拉姆达被修改 - 不要修改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++; 
} 
+0

谢谢,我现在看到了无限循环。这解决了这个问题,似乎是最有效的解决方案。唯一的是我试图设置降序编号。 – magoverflow 2012-01-17 15:22:16

+0

@magoverflow:使用两种方法更新答案以实现降序编号 – BrokenGlass 2012-01-17 15:30:09

2

我BrokenGlass同意,你正在运行到一个无限循环。

你可以实现使用foreach同样的事情:

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

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

我会尝试这个代码,而不是递减i同时枚举通过阵列

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

虽然它很难告诉你的尝试要做,它是一个很好的选择,你并不是要继续指向同一个变量我,这是什么导致无限循环。 继承人你想要的是什么,我相信另一个例子

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。它也很好地描述你的代码在这篇文章中做什么,包括你的预期结果是什么,以及你目前的例子不符合他们的。不要让你的非工作例子单独解释你想要的东西,它只向我们展示了你不想要的东西的例子。

相关问题