按多个字段排序列表(C#)? [复制]

Posted

技术标签:

【中文标题】按多个字段排序列表(C#)? [复制]【英文标题】:Order a List (C#) by many fields? [duplicate] 【发布时间】:2011-02-16 06:53:40 【问题描述】:

我想在 C# 中按多个字段排序对象列表,而不仅仅是一个。例如,假设我有一个名为 X 的类,它有两个属性 A 和 B,并且我有以下对象,按此顺序:

object1 => A = "a", B = "h" object2 => A = "a", B = "c" object3 => A = "b", B = "x" object4 => A = "b", B = "b"

我想先按 A 属性对列表进行排序,当它们相等时,按 B 元素排序,所以顺序是:

“a”“c” "a" "h" "b" "b" "b" "x"

据我所知,OrderBy 方法按一个参数排序。

问题:如何按多个字段对 C# 列表进行排序?

【问题讨论】:

【参考方案1】:

使用ThenBy:

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

参见 MSDN:http://msdn.microsoft.com/en-us/library/bb549422.aspx

【讨论】:

这不是为我订购的吗?我错过了什么?docs.OrderBy(o => o.AcctNum) .ThenBy(o => o.DocDate); 您可能使用的是较旧的 .net。检查这个答案:***.com/questions/289010/…. 对于后代:OrderBy 不对原始集合进行排序,它返回一个 IOrderedEnumerable,因此您需要将 OrderBy 的结果分配给一个变量。例如客户 = customers.OrderBy(c=>c.Surname).ThenBy(c.Forename).ToList();【参考方案2】:

是的,您可以通过指定比较方法来做到这一点。优点是排序对象不必是 IComparable

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

【讨论】:

【参考方案3】:

您的对象应该实现IComparable 接口。

有了它,你的类就变成了一个名为CompareTo(T other)的新函数。在此函数中,您可以在当前对象和另一个对象之间进行任何比较,并返回一个整数值,判断第一个对象是否大于、小于或等于第二个对象。

【讨论】:

【参考方案4】:

使您的对象类似于

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();

【讨论】:

问题:如何按多个字段排序 C# 列表?是的!

以上是关于按多个字段排序列表(C#)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何按 Grails 中的多个字段排序?

C#按以下值对排序列表进行分组

按价格排序列表c#

具有多个字段的 LINQ OrderBy

按字符串属性C#对对象列表进行排序[重复]

c#将连接项的列表排序为多个列表