在List中按对象的属性对对象进行排序

Bax*_*ter 11 c# sorting properties list

我有一个C#中的对象列表.所有对象都包含属性code1和code2(以及其他属性).对象列表没有特定的顺序.我需要通过code1和code2属性对对象列表进行排序.

例:

List -> object = id, name, code1, code2, hours, amount.
Run Code Online (Sandbox Code Playgroud)

示例代码1 = 004
示例代码2 = 001,002,003,004,016
示例代码1 = 005
示例代码2 = 001,002,003,004

所以在排序之后我会按以下顺序想要对象

004 001
004 002
004 003
004 005
004 016
005 001
005 002
005 003
005 004
Run Code Online (Sandbox Code Playgroud)

Ada*_*rth 18

您可以使用linq扩展(保留原始列表未排序):

var sorted = theList.OrderBy(o => o.code1).ThenBy(o => o.code2);
Run Code Online (Sandbox Code Playgroud)

要使用已排序的列表替换原始列表,请进行轻微修改(效率不高,创建新列表):

theList = theList.OrderBy(o => o.code1).ThenBy(o => o.code2).ToList();
Run Code Online (Sandbox Code Playgroud)

这假定您的列表类型正确,如:

List<MyClass> theList = new List<MyClass>();
Run Code Online (Sandbox Code Playgroud)

而不是对象列表,在这种情况下你需要使用.Cast<>().OfType<>().

  • 请注意,这会使原始列表保持未分类状态. (4认同)

pho*_*oog 9

请注意,Adam Houldsworth对该.ToList()调用的回答不必要地创建了一个新列表.如果您的列表很大,这可能会产生不可接受的内存压力.通过提供自定义比较功能,最好对列表进行排序:

theList.Sort((a, b) =>
    {
        var firstCompare = a.code1.CompareTo(b.code1);
        return firstCompare != 0 ? firstCompare : a.code2.CompareTo(b.code2);
    });
Run Code Online (Sandbox Code Playgroud)

或者,如果此排序是您的类型的固有属性,您可以IComparable<T>在您的类型上实现,然后只需调用

theList.Sort();
Run Code Online (Sandbox Code Playgroud)

......将使用该IComparable<T>.CompareTo()实现.

  • +1如果表现有问题,那就好点. (2认同)
  • @AdamHouldsworth当然,你的方法提供更整洁的代码.我可能会使用Linq,如果我确定该列表永远不会包含多个项目,因为在这种情况下性能不太可能是一个问题. (2认同)