【问题标题】:Order a List (C#) by many fields? [duplicate]按多个字段排序列表(C#)? [复制]
【发布时间】: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# 列表进行排序?

【问题讨论】:

    标签: c# list lambda sql-order-by


    【解决方案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。检查这个答案:stackoverflow.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# 列表?是的!
        猜你喜欢
        • 2011-07-24
        • 2022-12-07
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 2020-11-25
        相关资源
        最近更新 更多