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

Esa*_*abe 91 c# lambda list sql-order-by

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

非常感谢你

Dav*_*ale 263

用途ThenBy:

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

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

  • 对于后代:OrderBy不对原始集合进行排序,它返回IOrderedEnumerable <T>,因此您需要将OrderBy的结果分配给变量.例如customers = customers.OrderBy(c => c.Surname).ThenBy(c.Forename).ToList(); (9认同)
  • 这不是为我订购的吗?我缺少什么?docs.OrderBy(o =&gt; o.AcctNum).ThenBy(o =&gt; o.DocDate); (2认同)

CMi*_*nus 32

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

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


Jas*_*ong 8

让你的对象像

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 ");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还要注意CompareTo的返回值:

http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx

然后,如果你有一个MyObject列表,请调用.Sort()即

var objList = new List<MyObject>();
objList.Sort();
Run Code Online (Sandbox Code Playgroud)