LINQ OrderBy有多个字段

bra*_*mus 76 c# linq

我有一个列表,我需要按两个字段排序.我尝试在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.
Run Code Online (Sandbox Code Playgroud)

tza*_*man 156

你需要使用ThenBy:

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)
Run Code Online (Sandbox Code Playgroud)

  • 我不确定你是什么意思.查询语法只是上面方法语法的糖; 两者都是"LINQ".请参阅http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx如果您阅读了该问题,他就会特别询问方法语法版本. (5认同)

svi*_*ick 23

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

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)
Run Code Online (Sandbox Code Playgroud)

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

from person in listOfPeople
orderby person.LastName, person.FirstName
select person
Run Code Online (Sandbox Code Playgroud)

上面的代码实际上将被编译为使用OrderBy()和的代码ThenBy(),如第一个例子中所示.

另外,如果你想有OrderBy()一个带有两个(或更多)排序键,你当然可以写上扩展方法IEnumerable<T>在内部调用OrderBy()ThenBy().