LINQ OrderBy具有多个字段


82

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

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

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

我已经看到您可以使用类似SQL的语法来完成此操作,但是我正在寻找一种使用OrderBy方法执行此操作的方法。

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

Answers:


169

您需要使用ThenBy

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


这是Lambda .. LINQ解决方案需求@svick在LINQ中具有它。
拉维·拉姆

5
我不确定你是什么意思。查询语法只是上面方法语法的糖。两者都是“ LINQ”。请参阅msdn.microsoft.com/zh-cn/library/vstudio/bb397947.aspx 。如果您阅读此问题,则他特别要求提供方法语法版本。
tzaman 2013年

24

如果要使用方法语法,请使用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
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);

2

订购具有更多字段的列表的方法如下:

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

您可以使用clasole“ ThenBy”添加其他字段

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.