2011-08-20 61 views
0

我選一個自定義類,如下所示,這是由FirstHalfPoints排序:定製的C#集合類排序由多個屬性

var firstHalfTables = new FirstHalfTableCollection(); 
     firstHalfTables.PopulateForSeason(SeasonId); 
     firstHalfTables.Sort((t1, t2) => t1.FirstHalfPoints.CompareTo(t2.FirstHalfPoints)); 
     firstHalfTables.Reverse(); 
     FirstHalfTableRepeater.DataSource = firstHalfTables; 
     FirstHalfTableRepeater.DataBind(); 

我還需要通過另外兩個領域「GD」排序 - 淨勝球'GF' - 目標For-在首次排序後按'FirstHalfPoints'

因此,完成的集合將按FirstHalfPoints,GD,GF排序。

任何人都可以幫助我與多重排序?

回答

2

你可以使用LINQ,這往往使代碼更易讀:

var firstHalfTables = new FirstHalfTableCollection(); 
firstHalfTables.PopulateForSeason(SeasonId); 
var firstHalfTablesProcessed = (from table in firstHalfTables 
           orderby table.FirstHalfPoints, table.GD, table.GF 
           select table).Reverse() 
FirstHalfTableRepeater.DataSource = firstHalfTablesProcessed; 

或者你可以讓你的比較委託返回正確的排序(可能是因爲比拉姆達正常功能越好):

int FirstHalfTableComparison(FirstHalfTable t1, FirstHalfTable t2) 
{ 
    int result = t1.FirstHalfPoints.CompareTo(t2.FirstHalfPoints); 

    if (result == 0) 
    { 
     result = t1.GD.CompareTo(t2.GD); 

     if (result == 0) 
      result = t1.GF.CompareTo(t2.GF); 
    } 

    return result; 
} 

您可以使用這樣的:

firstHalfTables.Sort(FirstHalfTableComparison); 
+0

謝謝我在這裏選擇了第一個選項,就像你寫的那樣,非常感謝你的幫助。 – Kevin

1

你可以直接使用LINQ表達式: 「排序依據」 和 「ThenBy」 太:MSDN Sorting Data

OR

你有你的程度比較。你必須記住:a.CompareTo(b)如果a比b小,則返回-1,如果它們相等,則返回0,如果a比b更大,則返回+1。 所以請嘗試以下操作:

private void Compare(YourRow a, YourRow b) 
{ 
    let v = a.FirstHalfPoints.CompareTo(b.FirstHalfPoints); 
    if (v != 0) return v; 

    v = a.GD.CompareTo(b.GD); 
    if (v != 0) return v; 

    return a.GF.CompareTo(b.GF); 
} 

,並呼籲Sort使用此功能。

+0

另外,不要忘記來實現[IComparable接口(HTTP: //msdn.microsoft.com/en-us/library/system.icomparable.aspx) –

+0

您不必在有像這種情況下的排序覆蓋時 – Carsten

+0

'CompareTo()'不必返回只是-1,0或1.它可以返回任何'int'。我希望你在編寫代碼時不要依賴它(你不在你發佈的代碼中)。 – svick