En utilisant la lambda expression à la place de IComparer argument
Est-il possible avec C# pour passer d'une expression lambda comme un IComparer argument dans l'appel de méthode?
par exemple quelque chose comme
var x = someIEnumerable.OrderBy(aClass e => e.someProperty,
(aClass x, aClass y) =>
x.someProperty > y.SomeProperty ? 1 : x.someProperty < y.SomeProperty ? -1 : 0);
Je n'arrive pas à obtenir ce pour compiler donc je suppose que non, mais il semble une synergie évidente entre les lambdas et les délégués anonymes que j'ai le sentiment que je dois faire quelque chose de follement mal.
TIA
- Réponse Possible ici: stackoverflow.com/questions/9824435/...
Vous devez vous connecter pour publier un commentaire.
Comme Jeppe, si vous êtes sur .NET 4.5, vous pouvez utiliser la méthode statique
Comparer<T>.Create
.Si non, c'est une mise en œuvre qui devrait être équivalent:
<T>
partie du nom de la classe.Si vous êtes sur .NET 4.5, vous pouvez utiliser la méthode statique
Comparer<aClass>.Create
.Documentation:
Comparer<T>.Créer
Méthode .Exemple:
.OrderBy
(Linq) a décidé de ne pas avoir une surcharge qui a accepté un délégué pour la comparaison (comme unComparison<TKey>
délégué). Vous pouvez créer votre propre méthode d'extension si vous le souhaitez.Equals
etGetHashCode
. Il n'existe pas de méthode qui vous permet de le faire à partir de deux délégués (lambda). Au lieu de cela, créez votre propre classe et de l'utilisationEqualityComparer<YourType>
comme la classe de base. Vous aurez besoin de mettre en œuvre seulement deux méthodes abstraites, et pour que vous obtenez un objet qui est à la foisIEqualityComparer<YourType>
etIEqualityComparer
(vous n'avez pas à spécifier ces deux interfaces, ils viennent gratuitement à partir de la classe de base). Notez queIEqualityComparer<in T>
est contravariant enT
, de sorte que votre classe peut également être utilisé comme unIEqualityComparer<AnyDerivedYourType>
.Si vous avez toujours souhaitez comparer projetée clés (par exemple une seule propriété), vous pouvez définir une classe qui encapsule toutes les clés logique de comparaison pour vous, y compris null contrôles, d'extraction de clé sur les deux objets, et de la comparaison clé à l'aide de la spécifiés ou à défaut intérieure comparer:
Pour plus de commodité, une méthode de fabrique:
Vous pouvez ensuite utiliser ce comme suit:
Vous pouvez vous référer à mon post de blog une discussion étendue de cette mise en œuvre.