2013-01-04 176 views
1

我目前正在使用列表中包含的對象類型中的'CompareTo'方法對C#列表進行排序。我想通過自己的WBS(工作分解結構)遞增的所有項目進行排序,我可以管理這個很好用下面的代碼:用兩個參數對列表進行排序使用CompareTo

 public int CompareTo(DisplayItemsEntity other) 
     { 
      string[] instanceWbsArray = this.WBS.Split('.'); 
      string[] otherWbsArray = other.WBS.Split('.'); 

      int result = 0; 

      for (int i = 0; i < maxLenght; i++) 
      { 
       if (instanceWbsArray[i].Equals(otherWbsArray[i])) 
       { 
        continue; 
       } 
       else 
       {  
        result = Int32.Parse(instanceWbsArray[i]).CompareTo(Int32.Parse(otherWbsArray[i])); 
        break; 
       } 
      } 
      return result; 
     } 

現在,我想能夠排序考慮多個參數,就像在項目名稱中按字母順序排列,然後再考慮第二個項目是WBS。我怎樣才能做到這一點?

回答

9

我不知道你的類的細節,所以我會提供一個使用字符串和LINQ列表的例子。 OrderBy將按字母順序排列字符串,ThenBy將按照其長度排序。您可以輕鬆地將此樣本適應您的需求。

var list = new List<string> 
{ 
    "Foo", 
    "Bar", 
    "Foobar" 
}; 
var sortedList = list.OrderBy(i => i). 
    ThenBy(i => i.Length). 
    ToList(); 
+0

如何使用'OrderBy()'方法? –

+1

@JFB假設你使用的是.NET 3.5或更高版本,你需要在文件的'using'指令中包含:'using System.Linq;' – Mir

+0

oops!現在我很尷尬。謝謝! –

0

首字母順序排列比較項目名稱,如果它們不相等返回值,如果基於第二值不執行比較

public int CompareTo(DisplayItemsEntity other) 
    { 
     if(other.ProjectName.CompareTo(this.ProjectName) != 0) 
     { 
      return other.ProjectName.CompareTo(this.ProjectName) 
     } 

     //else do the second comparison and return 


     return result; 
    } 
3

我們一般做在你們這樣的情況是這樣的:

public int CompareTo(SomeClass other) 
{ 
    int result = this.SomeProperty.CompareTo(other.SomeProperty); 
    if(result != 0) 
     return result; 
    result = this.AnotherProperty.CompareTo(other.AnotherProperty); 
    if(result != 0) 
     return result; 
    [...] 
    return result; 
} 

PS 發佈代碼時,請儘量只包含與您的問題相關的代碼。您發佈的代碼中存在大量內容,我不需要閱讀,這實際上使我的眼睛受傷。

2

我喜歡夏娃的答案,因爲它的靈活性,但我有點驚訝,沒有人提到創建自定義IComparer<T>實例

IComparer<T>是一個通用接口,用於定義比較類型T的兩個實例的方法。使用IComparer<T>的優點是,您可以爲每個通常使用的排序順序創建實現,然後在必要時使用這些實現。這允許您在類型CompareTo()方法中創建默認排序順序,並分別定義替代訂單。

E.g.

public class MyComparer 
: IComparer<YourType> 
{ 
    public int Compare(YourType x, YourType y) 
    { 
    //Add your comparison logic here 
    } 
} 

IComparer<T>爲組合物,其中可以做的事情一樣具有使用了在該屬性的類型操作的另一比較器進行比較的給定類型的一些特性的比較器是特別有用的。

如果您需要定義您不控制的類型的排序,這也非常有用。它具有的另一個好處是它不需要LINQ,所以可以在舊代碼中使用(.Net 2.0以上)

相關問題