按许多字段订购清单(C#)?

Order a List (C#) by many fields?

本问题已经有最佳答案,请猛点这里访问。

我想在许多字段中订购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#列表?

非常感谢你


使用ThenBy

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

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


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

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


让你的对象像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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()即

1
2
var objList = new List<MyObject>();
objList.Sort();


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

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