La syntaxe Linq pour OrderBy à la coutume de Comparer<T>
Il existe deux formats pour une expression Linq avec un tri personnalisé comparer:
Format 1
var query =
source
.Select(x => new { x.someProperty, x.otherProperty } )
.OrderBy(x => x, new myComparer());
Format 2
var query =
from x in source
orderby x //comparer expression goes here?
select new { x.someProperty, x.otherProperty };
Question:
Quelle est la syntaxe de la commande-par l'expression, dans le second format?
Pas la question:
Comment utiliser un comparateur comme indiqué dans le premier format.
Bonus de crédit:
Y sont réels, les noms formels pour les deux Linq formats mentionnés ci-dessus?
Vous devez vous connecter pour publier un commentaire.
Il n'existe pas. À partir de la orderby de la clause de la documentation:
Vous l'avez écrit correctement. Vous pouvez passer à la
IComparer<T>
comme vous l'avez écrit.Format 1 est appelée "Méthode de Base de la Syntaxe" (de lien précédent), et Format 2 "Syntaxe d'Expression de Requête" (à partir de ici).
Vous ne pouvez pas utiliser un comparateur dans ce format.
Format 1 est la Méthode la syntaxe, Format 2 "la syntaxe de la requête",
Question:
Ce n'est pas possible dans la syntaxe de la requête, car il n'y a pas de surcharges.
Pas la question:
Vous pouvez utiliser un comparateur avec les types anonymes uniquement si vous utiliser la réflexion pour comparer les objets, il est préférable d'utiliser une tapée de mise en œuvre pour la comparaison.
Si vous ne voulez pas créer un tapé la mise en œuvre, vous pouvez utiliser un
Tuple
:Bonus de crédit:
Ce n'est pas nécessairement de répondre à la question d'origine, mais il s'étend un peu certaines des possibilités décrites. Je vous poste ça dans le cas où d'autres viennent à travers le problème similaire.
La solution posté ici les contours d'un générique de commande en option qui peut être utile dans d'autres cas. Dans cet exemple, j'ai voulu trier une liste de fichiers par des propriétés différentes.
Puis dans la mise en œuvre...
Le gros avantage est que vous n'avez pas besoin de créer une nouvelle classe pour chaque commande par cas, il vous suffit de fil un nouveau lambda. Évidemment, cela peut être étendu à toutes sortes de façons, donc espérons que cela aide quelqu'un, quelque part, d'.