133 votes

LINQ OrderBy et ThenBy

Quelqu'un peut-il expliquer quoi de la différence entre :

et

Qui est la bonne approche, si je désire commander par 3 éléments de données ?

229voto

Jon Skeet Points 692016

Vous devriez certainement utiliser ThenBy plutôt que de multiples OrderBy des appels. (Je suppose que l'un des fragments de code dans votre question a été conçue pour utiliser ThenBy. Au moment d'écrire ces lignes, les deux extraits sont identiques.)

Je dirais ceci:

tmp = invoices.InvoiceCollection
              .OrderBy(o => o.InvoiceOwner.LastName)
              .ThenBy(o => o.InvoiceOwner.FirstName)
              .ThenBy(o => o.InvoiceID);

Notez comment vous pouvez utiliser le même nom à chaque fois. C'est aussi l'équivalent de:

tmp = from o in invoices.InvoiceCollection
      orderby o.InvoiceOwner.LastName,
              o.InvoiceOwner.FirstName,
              o.InvoiceID
      select o;

Si vous appelez OrderBy plusieurs fois, il sera en fait réorganiser la séquence complètement trois fois... de sorte que le dernier appel sera effectivement le dominant. Vous pouvez (dans LINQ to Objects) écrire

foo.OrderBy(x).OrderBy(y).OrderBy(z)

ce qui équivaut à un

foo.OrderBy(z).ThenBy(y).ThenBy(x)

que l'ordre de tri est stable, mais vous avez absolument ne fallait pas:

  • C'est dur à lire
  • Il ne fonctionne pas bien (car il réorganise l'ensemble de la séquence)
  • Il se peut très bien ne pas travailler dans d'autres fournisseurs (par exemple, LINQ to SQL)
  • C'est fondamentalement pas comment OrderBy a été conçue pour être utilisée.

Le point de OrderBy est de fournir le "plus important" de la commande de projection; ensuite, utilisez ThenBy (à plusieurs reprises) pour spécifier secondaire, tertiaire, etc la commande de projections.

Effectivement, pensez-y de cette façon: OrderBy(...).ThenBy(...).ThenBy(...) vous permet de construire un seul et unique composite comparaison de deux objets, puis trier l'ordre d'une fois à l'aide de composites à la comparaison. C'est certainement ce que vous souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X