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.
brainimus
quelle

Antworten:

169

Sie müssen verwenden ThenBy:

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)
Zaman
quelle
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().

svick
quelle
3

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

Ben Robinson
quelle
2

Verwenden .ThenBy(aPerson=>field2);

Robaticus
quelle
2
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
moi_meme
quelle
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.

daniele3004
quelle