2010-06-15 13 views
58

Ich habe eine Liste, die ich nach zwei Feldern sortiert habe. Ich habe versucht, OrderBy in LINQ zu verwenden, aber das erlaubt mir nur, ein Feld anzugeben. Ich suche nach der Liste, die nach dem ersten Feld sortiert werden soll und dann, wenn im ersten Feld Duplikate vorhanden sind, nach dem zweiten Feld zu sortieren.LINQ OrderBy mit mehr als einem Feld

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

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

Ich habe gesehen, dass Sie die SQL like syntax to accomplish this verwenden können, aber ich bin auf der Suche nach einem Weg, um es 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. 

Antwort

120

Sie müssen ThenBy verwenden:

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

Eine vollständige Erklärung hier aufgeführt wird: http: // weblogs. asp.net/zeeshanhirani/archive/2008/04/16/thenby-operator-part-14.aspx – DigitalNomad

+0

Dies ist Lambda .. LINQ-Lösung brauchen @svick hat es in LINQ. –

+2

Ich bin mir nicht sicher, was du meinst. Die Abfragesyntax ist nur Zucker für die obige Methodensyntax; beide sind "LINQ". Siehe http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx Und wenn Sie die Frage lesen, fragt er speziell nach der Methodensyntaxversion. – tzaman

1

Verwenden .ThenBy(aPerson=>field2);

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

Ihre nachfolgenden Felder sollten mit Hilfe des ThenBy() -Methode

19

bestellt werden, wenn Sie wollen Verwenden Sie Methodensyntax, verwenden Sie ThenBy(), wie andere vorschlagen ed:

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

In Abfragesyntax kann das gleiches ziemlich die Art und Weise erreicht werden, man wollte: zwei durch ein Komma getrennt Schlüssel sortieren:

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

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

Auch wenn Sie OrderBy() haben mögen, die zwei (oder mehr) Sortierschlüssel nimmt, können Sie sicher schreiben, dass als eine Erweiterungsmethode auf IEnumerable<T>, die intern OrderBy() und ThenBy() nennen.

0

Die Möglichkeit, eine Liste mit mehr eingereicht, um zu bestellen ist der Nachfolger:

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

Sie andere Felder mit clasole hinzufügen können „ThenBy“