LINQ OrderBy mit mehr als einem Feld


82

Ich habe eine Liste, die ich nach zwei Feldern sortieren muss. Ich habe versucht, OrderBy in LINQ zu verwenden, aber dadurch kann ich nur ein Feld angeben. Ich suche nach einer Liste, die nach dem ersten Feld sortiert werden soll, und nach Duplikaten im ersten Feld, die nach dem zweiten Feld sortiert werden sollen.

Zum Beispiel möchte ich, dass die Ergebnisse so aussehen (sortiert nach Nachname und Vorname).

  • Adams, John
  • Smith, James
  • Smith, Peter
  • Thompson, Fred

Ich habe gesehen, dass Sie die SQL-ähnliche Syntax verwenden können, um dies zu erreichen, aber ich suche nach einer Möglichkeit, dies mit der OrderBy-Methode zu tun.

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

Antworten:


169

Sie müssen verwenden ThenBy:

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

1
Eine vollständige Erklärung ist hier aufgelistet: weblogs.asp.net/zeeshanhirani/archive/2008/04/16/...
Digitaler Nomade

Dies ist Lambda .. LINQ-Lösung benötigt @svick hat es in LINQ.
Ravi Ram

5
Ich bin mir nicht sicher was du meinst. Die Abfragesyntax ist nur Zucker für die obige Methodensyntax. beide sind "LINQ". Siehe msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx . Wenn Sie die Frage lesen, fragt er speziell nach der Syntaxversion der Methode.
Zaman

24

Wenn Sie die Methodensyntax verwenden möchten, verwenden Sie ThenBy()wie von anderen vorgeschlagen:

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

In der Abfragesyntax kann dasselbe so erreicht werden, wie Sie es wollten: zwei Sortierschlüssel, die durch ein Komma getrennt sind:

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

Der obige Code wird tatsächlich zu Code kompiliert, der OrderBy()und verwendet ThenBy(), wie im ersten Beispiel.

Wenn Sie möchten, OrderBy()dass zwei (oder mehr) Sortierschlüssel benötigt werden, können Sie dies auch als Erweiterungsmethode für IEnumerable<T>interne Aufrufe OrderBy()und schreiben ThenBy().


3

Ihre nachfolgenden Felder sollten mit der ThenBy () -Methode sortiert werden



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

2

Die Möglichkeit, eine Liste mit mehr Dateien zu bestellen, ist die folgende:

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

Sie können andere Felder mit der Klasse "ThenBy" hinzufügen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.