2010-06-15 81 views
58

我有一个列表,我需要按两个字段排序。我试过在LINQ中使用OrderBy,但只允许我指定一个字段。我正在寻找要按第一个字段排序的列表,然后如果第一个字段中有任何重复项要按第二个字段排序。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. 

回答

120

您需要使用ThenBy:如果你想

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

,完整的解释是列在这里添加其他领域。 asp.net/zeeshanhirani/archive/2008/04/16/thenby-operator-part-14.aspx – DigitalNomad 2010-06-15 17:27:26

+0

这是Lambda .. LINQ解决方案需要@svick在LINQ中有它。 – 2013-05-10 17:48:54

+2

我不确定你的意思。对于上面的方法语法,查询语法只是糖;都是“LINQ”。请参阅http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx 如果您阅读该问题,他特别要求提供方法语法版本。 – tzaman 2013-05-10 19:50:55

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

你的后续字段应当责令使用ThenBy()方法

19

使用方法的语法,使用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()扩展方法。

0

订购更多存档的清单的方法是如下:HTTP://博客

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

您可以clasole“ThenBy”