2013-04-08 151 views
0

我有一個通用列表,我試圖實現一個輔助排序類型。我能夠通過一種類型來排序,但無法進行二次排序。輔助排序List.Sort方法

這裏是什麼即時通訊與工作:

當林調用排序:

List<Totals> totals = new LoadTotalList(); 
totals.Sort(Totals.Status); 

這裏是彩民類:

public class Totals 
{ 
    public string Status { get; set; } 
    public string Total { get; set; } 
    public string Cost { get; set; } 

    public static Comparison<Totals> StatusComp = 
delegate(Totals item1, Totals item2) 
{ 
return item1.Status.CompareTo(item2.Status); 
}; 

    public static Comparison<Totals> CostComp = 
delegate(Totals item1, Totals item2) 
{ 
return item1.Cost.CompareTo(item2.Cost); 
}; 


} 

我用盡排序firt類型,然後排序第二種類型,但似乎不能獲得第二類型。我知道它可以用Linq使用OrderBy子句和ThenBy子句來完成。但是我有其他選項嗎?在此先感謝您的幫助!

回答

6

這是很容易地創建一個Comparison<T>其中有一個主要的比較,然後一個次:

public static class Comparisons 
{ 
    public static Comparison<T> Then<T>(this Comparison<T> primary, 
             Comparison<T> secondary) 
    { 
     // TODO: Nullity validation 
     return (x, y) => 
     { 
      int first = primary(x, y); 
      return first != 0 ? first : secondary(x, y); 
     }; 
    } 
} 

然後你可以使用:

list.Sort(Totals.StatusComp.Then(Totals.CostComp)); 

(您可以IComparer<T>做同樣容易)

+0

謝謝喬恩!你讓我開始工作。我非常感激。 – Botonomous 2013-04-08 15:10:53

+0

喬恩,這個類不應該是靜態的,因爲它是一個擴展方法嗎? – Botonomous 2013-04-08 15:18:34

+0

@Anon:是的,固定的,謝謝。 – 2013-04-08 16:02:48

1

您可以使用允許使用自定義比較代理的overload of List.Sort

totals.Sort((t1, t2) => { 
    if (t1.Status != t2.Status) return t1.Status.CompareTo(t2.Status); 
    else return t1.Cost.CompareTo(t2.Cost); 
}); 
+0

這也是一個很好的選擇。兩者都是很好的答案。感謝Tim – Botonomous 2013-04-08 15:11:55

+0

請注意,'!='總是使用*序數*比較。在有序比較下,字符串完全可能是不相等的,但'CompareTo'返回0。(有關示例,請參閱文檔'string.CompareTo'。) – 2013-04-08 16:04:23