2010-06-15 11 views
58

Ho una lista che ho bisogno di ordinare per due campi. Ho provato a utilizzare OrderBy in LINQ ma questo mi consente solo di specificare un campo. Sto cercando la lista da ordinare per il primo campo e poi se ci sono duplicati nel primo campo da ordinare per il secondo campo.LINQ OrderDa più di un campo

Ad esempio voglio i risultati a guardare come questo (ordinati per cognome poi nome).

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

ho visto che è possibile utilizzare il SQL like syntax to accomplish this ma sto cercando un modo per farlo con il metodo OrderBy.

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

risposta

120

è necessario utilizzare ThenBy:

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

Una spiegazione completa è elencata qui: http: // blog. asp.net/zeeshanhirani/archive/2008/04/16/thenby-operator-part-14.aspx – DigitalNomad

+0

Questo è Lambda. La soluzione LINQ ha bisogno di @svick in LINQ. –

+2

Non sono sicuro di cosa intendi. La sintassi delle query è solo zucchero per la sintassi del metodo di cui sopra; entrambi sono "LINQ". Vedere http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx E se si legge la domanda, chiede specificamente la versione della sintassi del metodo. – tzaman

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

I suoi campi successivi devono essere ordinati utilizzando il metodo

19

ThenBy() Se si desidera utilizzare la sintassi del metodo, utilizzare ThenBy(), come suggeriscono altri Ed:

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

In sintassi di query, lo stesso può essere realizzato o meno il modo in cui si voleva: due chiavi di ordinamento separati da una virgola:

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

Il codice di cui sopra saranno effettivamente compilato in codice che utilizza OrderBy() e ThenBy(), come nel primo esempio.

Inoltre, se si desidera avere OrderBy() che prende due chiavi di ordinamento (o più), si può certamente scrivere che come un metodo di estensione su IEnumerable<T> che chiama internamente OrderBy() e ThenBy().

0

Il modo per ordinare una lista con più depositata è la seguente:

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

È possibile aggiungere altri campi con clasole "ThenBy"

Problemi correlati