按多个字段排列一个 List (C #) ?

我想在 C # 中对对象列表进行多个字段的排序,而不仅仅是一个字段。例如,假设我有一个名为 X 的类,它有两个 Attritribute,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 # 列表进行排序?

146424 次浏览

使用 ThenBy:

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

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

让你的目标像

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 列表,调用

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

您的对象应该实现 可比接口。

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

是的,您可以通过指定比较方法来完成。优点是排序后的对象不一定是 ICompable

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