2011-08-02 69 views
0

我收集的物品,他們每個人都有int TypeId屬性。我需要對這個集合中的物品重新排序(或者獲得新的物品),其中物品首先被訂購,所有物品首先是TypeId = 3,然後是TypeId = 1,然後是TypeId = 2
我的解決辦法是:收集自定義重新排序

var result = new List<A>(); 
result.AddRange(source.Where(i => i.TypeId == 3)); 
result.AddRange(source.Where(i => i.TypeId == 1)); 
result.AddRange(source.Where(i => i.TypeId == 2)); 

我想知道,任何有沒有多個迭代另一個快速的解決方案在source集合(可能是一些LINQ招)?

+0

什麼類型的收藏是你的名單?一些集合類具有內置的排序功能,可以非常快速。通常QuickSort是首選的方法,儘管(取決於Where函數的快速程度),但此方法看起來非常有效。 –

+1

@Nick Udell:這是一個按字段排序的技巧,排序時應使用與自然排序不同的技巧。所以我相信這不是標準排序算法的任務 – sll

回答

3

您只需創建一個訂單序列數組,然後通過索引索引在OrderBy語句中使用它。這裏是僞邏輯(我不記得的IndexOf可與本機陣列,但如果不只是用另一個集合型)

int[] order = new int[] { 3, 1, 2}; 
    source.OrderBy(i => Array.IndexOf(order, i.TypeId)); 

- EDITED基於從盧克評論的例子,這樣它會編譯正確

+0

+1,但是你需要使用靜態的'Array.IndexOf(order,i.TypeId)'而不是'order.IndexOf(i.TypeId)'。 – LukeH

+0

非常適合添加。我將編輯答案,使其更準確 –

+0

如果您想要就地排序,而不是返回新序列:'source.Sort((x,y)=> Array.IndexOf(order,x.TypeId ).CompareTo(Array.IndexOf(order,y.TypeId)));' – LukeH