2010-05-06 98 views
65

我想在C#中的對象列表中的許多字段,而不僅僅是一個。例如,假設我有一個名爲X的類,它具有兩個屬性A和B,並且我按以下順序具有以下對象:許多字段排序列表(C#)?

object1 => A =「a」,B =「h」
Object2的=> A = 「一」,b = 「C」
object3 => A = 「b」,b = 「X」
object4 => A = 「b」,b = 「b」 的

我想先按A屬性排序,當它們是等於時,按B元素排序,因此排序爲:

「a」「c」
「a」「h」
「b」 的 「B」
「B」 的 「x」

據我所知,通過一個參數的排序依據方法順序。

問題:如何通過多個字段排列C#列表?

非常感謝您

回答

201

使用ThenBy

Customer.OrderBy(c => c.LastName).ThenBy(c => c.FirstName)

請參閱MSDN:http://msdn.microsoft.com/en-us/library/bb549422.aspx

+1

這沒有命令他們爲我?我錯過了什麼?docs.OrderBy(o => o.AcctNum) 。ThenBy(o => o.DocDate); – 2016-11-28 19:07:49

+0

您可能正在使用較舊的.net。檢查這個答案:http://stackoverflow.com/questions/289010/c-sharp-list-sort-by-x-then-y/289040#289040。 – 2016-12-01 15:32:17

+1

後人:OrderBy不會對原始集合進行排序,它會返回一個IOrderedEnumerable ,因此您需要將OrderBy的結果分配給一個變量。例如customers = customers.OrderBy(c => c.Surname).ThenBy(c.Forename).ToList(); – CptCoathanger 2017-05-31 10:59:20

6

讓你的對象像

public class MyObject : IComparable 
{ 
    public string a; 
    public string b; 

    virtual public int CompareTo(object obj) 
    { 
     if (obj is MyObject) 
     { 
      var compareObj = (MyObject)obj; 
      if (this.a.CompareTo(compareObj.a) == 0) 
      { 
       // compare second value 
       return this.b.CompareTo(compareObj.b); 
      } 
      return this.a.CompareTo(compareObj.b); 
     } 
     else 
     { 
      throw new ArgumentException("Object is not a MyObject "); 
     } 
    } 
} 

也注意到,爲回報的CompareTo:

http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx

然後,如果你有MyObject來的名單,撥打的.sort()即

var objList = new List<MyObject>(); 
objList.Sort(); 
+0

問題:如何通過多個字段訂購C#列表? 是的! – 2010-05-06 08:02:12

0

你的對象應該實現IComparable接口。

有了它,你的班級變成了一個新的功能CompareTo(T other)。在這個函數中,你可以在當前和其他對象之間進行任何比較,並返回一個整數值,如果第一個比第二個更大,更小或相等。

24

是的,你可以通過指定比較方法來做到這一點。優點是排序的對象不必是IComparable

aListOfObjects.Sort((x, y) => 
    { 
     int result = x.A.CompareTo(y.A); 
     return result != 0 ? result : x.B.CompareTo(y.B); 
    });