2010-06-15 5 views
58

J'ai une liste dont j'ai besoin triée par deux champs. J'ai essayé d'utiliser OrderBy dans LINQ mais cela me permet seulement de spécifier un champ. Je cherche la liste à trier par le premier champ et puis s'il y a des doublons dans le premier champ pour trier par le deuxième champ. Par exemple, je veux que les résultats ressemblent à ceci (triés par nom de famille puis prénom).LINQ OrderBy avec plus d'un champ

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

J'ai vu que vous pouvez utiliser le SQL like syntax to accomplish this mais je suis à la recherche d'un moyen pour le faire avec la méthode OrderBy.

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

Répondre

120

Vous devez utiliser ThenBy:

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

Une explication complète est répertorié ici: http: // weblogs. asp.net/zeeshanhirani/archive/2008/04/16/thenby-operator-part-14.aspx – DigitalNomad

+0

Ceci est Lambda .. LINQ solution besoin @svick l'a dans LINQ. –

+2

Je ne suis pas sûr de ce que vous voulez dire. La syntaxe de requête est juste du sucre pour la syntaxe de la méthode ci-dessus; les deux sont "LINQ". Voir http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx Et si vous lisez la question, il demande spécifiquement la version de la syntaxe de la méthode. – tzaman

1

Utilisez .ThenBy(aPerson=>field2);

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

Vos champs suivants doivent être commandés en utilisant la méthode ThenBy()

19

Si vous voulez utilisez la syntaxe de la méthode, utilisez ThenBy(), comme d'autres ed:

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

Dans la syntaxe de requête, la même chose peut être accompli à peu près la façon dont vous vouliez: deux clés de tri séparés par une virgule:

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

Le code ci-dessus seront effectivement compilés au code utilise OrderBy() et ThenBy(), comme dans le premier exemple.

Aussi, si vous souhaitez avoir OrderBy() qui prend deux clés de tri (ou plus), vous pouvez certainement écrire que comme une méthode d'extension sur IEnumerable<T> qui appelle en interne OrderBy() et ThenBy().

0

La façon de commander une liste plus déposée est la suivante:

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

Vous pouvez ajouter d'autres champs avec clasole « ThenBy »

Questions connexes