2009-10-23 56 views
1

這是我的設置。C#列表<T> OrderBy總是返回null

public class ItemList : List<Item> 
{ 
    public void Load() {...} 
    public void Save() {...} 
} 

負載從一個XML文件中讀取來填充ITEMLIST

然後我試圖通過一個優先訂購的項目清單。這是一個int?但爲了測試目的,所有項目都有不同的值。

ItemList itemList = new ItemList(); 
itemList.Load(); 

ItemList newItemList = itemList 
         .OrderBy(item => item.Priority) as ItemList; 

return newItemList; 

在上面的newItemList始終爲空。 itemList的計數爲7.我檢查了三倍,itemList實例中的所有項目都有一個優先級設置。

我在做什麼錯?

我也試過......

ItemList newItemList = itemList 
         .OrderBy(item => item.Priority) 
         .ToList() as ItemList; 

一切似乎是工作。

在此先感謝!

回答

2

OrderBy或ToList都沒有返回一個ItemList,所以如Joseph所指出的那樣,投射返回null。

正如你從List<T>類繼承,你可以只使用排序方法對它進行排序:

ItemList itemList = new ItemList(); 
itemList.Load(); 
itemList.Sort((x, y) => x.Priority.CompareTo(y.Priority)); 
return itemList; 
+0

我試圖避免使用Sort,因爲除非我誤會,我經常這樣做,它需要構建CompareTo方法來處理我想要排序的所有內容。 – Altonymous 2009-10-23 14:52:25

+0

順便說一句,當我嘗試並使用此解決方案時,CompareTo不是一個有效的方法關閉優先級。優先級是一個整數? – Altonymous 2009-10-23 14:54:27

+0

知道了! itemList((x,y)=> x.Priority.HasValue.CompareTo(y.Priority)); – Altonymous 2009-10-23 14:56:35

7

問題是OrderBy不返回一個ItemList,它返回一個IOrderedEnumerable,而ToList()不返回一個ItemList,它返回一個List。無論哪種方式,你都試圖將它們都投射到一個ItemList,而他們不是,所以你得到null。

ItemList someList = (new ItemList {new Item(2), new Item(1), new Item(3)}); 

//this returns an IOrderedEnumerable<Item> 
var result = someList.OrderBy(i => i.Priority); 

//this returns a List<Item> 
var otherResult = someList.ToList(); 
+0

謝謝你的解釋,現在我只需要弄清楚如何使用排序依據,並最終一個ItemList。我不想使用Sort,因爲我不想爲一切構建CompareTo方法。 當我嘗試和使用下面的解決方案使用Sort SortTo不是一個有效的方法關閉優先級,優先級是一個int? – Altonymous 2009-10-23 14:53:56

+0

知道了! itemList((x,y)=> x.Priority.HasValue.CompareTo(y.Priority)); – Altonymous 2009-10-23 14:57:06

+0

沒有答案..沒有想到它通過...當我使用HasValue它試圖比較HasValue,這是一個布爾,結果的優先級。 仍在努力! – Altonymous 2009-10-23 14:58:57

0

我認爲你的問題是「作爲ItemList」。

+0

由於結果無法轉換爲ItemList,因此無法使用。 – 2009-10-23 14:47:00

+0

好點。我沒有考慮到需要將列表重新上傳到ItemList類型。 – CodingWithSpike 2009-10-23 14:48:07

0

LINQ運算符不能在你的newItemList對象上就地工作。他們創建並返回新的對象。如果你想進行就地排序,你應該使用List <>的Sort()方法。