按多个字段排序列表(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是的,您可以通过指定比较方法来做到这一点。优点是排序对象不必是 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#)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章