2012-01-13 69 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。它也很好地描述你的代碼在這篇文章中做什麼,包括你的預期結果是什麼,以及你目前的例子不符合他們的。不要讓你的非工作例子單獨解釋你想要的東西,它只向我們展示了你不想要的東西的例子。

相關問題