2009-07-02 55 views
7

誰能幫助..我有一個通用的列表,像這樣使用存儲在另一個列表(C#)中的自定義順序對列表<>進行排序?

IList<itemTp> itemTps; 

itemTp基本上是一個類(有許多屬性),並就這一個屬性是「代碼」

我需要能夠按照我在另一個列表中設置的特定順序對其進行排序。

這個列表是一個簡單的列表,其中列出的順序(從第一個開始到最後一個)喜歡說

代碼1 CODE3 碼2 代碼4 (注意它會從1到3比2,以5 - 這些都是名稱,他們可以被稱爲任何東西..重要的是訂單,它與數字沒有任何關係)

基本上我需要確保itemTp中的項目根據其他列表中的內容進行排序...

所以想象我ILIST是這樣的代碼1,代碼2,CODE3,代碼4 - 所以一旦排序是在做 我

 IList<itemTp> 

將包含4類,是爲了和有像編碼1,CODE3,CODE2,代碼4財產(訂單更改)

任何想法如何做到這一點?

回答

9

您需要創建一個IComparer來根據另一個列表的狀態來比較項目。使用IComparer的優點是,如果需要優化,您可以將緩存邏輯構建到類中以避免重複使用IndexOf()查找。此外,您可以維護多個可在適當時使用的「其他」列表。

class ItemTpComparer : IComparer<itemTp> 
{ 
    private IList<codeTp> otherList; 

    public ItemTpComparer(IList<codeTp> otherList) 
    { 
     this.otherList = otherList; 
    } 

    public int Compare(itemTp a, itemTp b) 
    { 
     return otherList.IndexOf(a.Code) - otherList.IndexOf(b.Code); 
    } 
} 

,並進行排序:

myList.Sort(new ItemTpComparer(otherList)); 
0

很抱歉,如果事情是錯的,我沒有在這裏安裝一個C#編輯器,但它是這樣的:

Array.Sort(
    itemTps, 
    delegate(ItemTp a, ItemTp b) 
    { 
      return secondList.IndexOf(a.Code) - secondList.IndexOf(b.Code); 
    }); 

注意:它可能不是最有效的方式,而且也沒有檢查第二個列表是否包含代碼。

[編輯]正如Mehrdad所說,Array.Sort不適用於通用IList<T>。要對數組進行排序,您需要使用ArrayList.Adapter方法創建一個包裝器,然後對其進行排序。由於ArrayList.Sort不支持委託比較,因此您需要將匿名委託放在IComparer<T>的實施中。

如果您需要在單獨的列表中對其進行排序,則可以通過首先創建數組來使用上述邏輯。

+0

陣列。排序不適用於通用IList 2009-07-02 21:16:50

+0

是的..我只是想比較。這是它:http://stackoverflow.com/questions/15486/sorting-an-ilist-in-c – Groo 2009-07-02 21:22:01

0

使用C#3和LINQ to對象,我只想創造,而不是試圖梳理現有的一個新的列表:

void Example() 
{ 
    IList<string> codes; 
    IList<ItemTp> itemTps; 
    itemTps = codes.Select(code => itemTps.Single(itp => itp.Code == code)).ToList(); 
} 
相關問題