LINQ OrderBy有多个字段

时间:2010-06-15 17:23:13

标签: c# linq

我有一个列表,我需要按两个字段排序。我尝试在LINQ中使用OrderBy,但这只允许我指定一个字段。我正在寻找要按第一个字段排序的列表,然后如果第一个字段中有任何重复项要按第二个字段排序。

例如,我希望结果看起来像这样(按姓氏排序,然后按名字排序)。

  • 亚当斯,约翰
  • 史密斯,詹姆斯
  • 史密斯,彼得
  • 汤普森,弗雷德

我已经看到你可以使用SQL like syntax to accomplish this,但我正在寻找一种方法来使用OrderBy方法。

IList<Person> listOfPeople = /*The list is filled somehow.*/
IEnumerable<Person> sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName, aPerson.FirstName); //This doesn't work.

6 个答案:

答案 0 :(得分:143)

您需要使用ThenBy

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)

答案 1 :(得分:23)

如果您想使用方法语法,请使用其他人建议的ThenBy()

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)

在查询语法中,可以按照您想要的方式完成相同的操作:两个以逗号分隔的排序键:

from person in listOfPeople
orderby person.LastName, person.FirstName
select person

上面的代码实际上会编译为使用OrderBy()ThenBy()的代码,如第一个示例所示。

此外,如果您希望OrderBy()使用两个(或更多)排序键,您当然可以将其作为内部调用IEnumerable<T> OrderBy()的扩展方法编写。和ThenBy()

答案 2 :(得分:2)

您的后续字段应使用ThenBy()方法

进行排序

答案 3 :(得分:1)

使用.ThenBy(aPerson=>field2);

答案 4 :(得分:1)

var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);

答案 5 :(得分:0)

订购包含更多字段的列表的方法如下:

var soterdList = initialList.OrderBy(x => x.Priority).
                                    ThenBy(x => x.ArrivalDate).
                                    ThenBy(x => x.ShipDate);

您可以使用clasole“ThenBy”

添加其他字段