複数のフィールドを持つLINQOrderBy


83

2つのフィールドでソートする必要があるリストがあります。LINQでOrderByを使用しようとしましたが、1つのフィールドしか指定できません。最初のフィールドで並べ替えるリストを探しています。次に、最初のフィールドに重複がある場合は、2番目のフィールドで並べ替えます。

たとえば、結果を次のようにします(姓、名の順に並べ替えます)。

  • アダムズ、ジョン
  • スミス、ジェームズ
  • スミス、ピーター
  • トンプソン、フレッド

これを実現するためにSQLのような構文を使用できることを確認しましたが、OrderByメソッドを使用してそれを行う方法を探しています。

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

回答:


171

あなたは使用する必要がありますThenBy

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

1
完全な説明はここにリストされています:weblogs.asp.net/zeeshanhirani/archive/2008/04/16/…–
DigitalNomad

これはラムダです..LINQソリューションには@svickがLINQにある必要があります。
Ravi Ram 2013年

5
どういう意味かわかりません。クエリ構文は、上記のメソッド構文の単なる砂糖です。どちらも「LINQ」です。msdn.microsoft.com/en-us/library/vstudio/bb397947.aspxを参照してください。 質問を読んだ場合、彼は特にメソッド構文バージョンを求めています。
tzaman 2013年

25

メソッド構文を使用する場合ThenBy()は、他の人が提案しているように、を使用します。

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

クエリ構文では、同じことがほぼ希望どおりに実行できます。コンマで区切られた2つの並べ替えキー:

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

上記のコードは、最初の例のように、OrderBy()とを使用するコードに実際にコンパイルされますThenBy()

あなたが持っているしたい場合にも、OrderBy()それが2つ(またはそれ以上)のソートキーを取り、あなたは確かに拡張メソッドとしてあることを書くことができ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);

クラスル「ThenBy」で他のフィールドを追加できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.