La concaténation de Lambda Fonctions en C#
À l'aide de C# 3.5, je voulais construire un prédicat à envoyer à une clause where, morceau par morceau. J'ai créé un très simple Application Console pour illustrer la solution que j'ai trouvée. Cela fonctionne parfaitement. Absolument parfaitement. Mais je n'ai AUCUNE idée de comment ou pourquoi.
public static Func<Tran, bool> GetPredicate()
{
Func<Tran, bool> predicate = null;
predicate += t => t.Response == "00";
predicate += t => t.Amount < 100;
return predicate;
}
Quand je dis " prédicat +=', ça veut dire quoi? le prédicat -= semble ne rien faire et ^=, &=, *=, /= ne pas aimé par le compilateur.
Le compilateur n'aime pas 'prédicat = prédicat + t => t.Réponse....' soit.
Que je suis tombé sur? Je sais ce qu'il fait, mais comment fait-il cela?
Si quelqu'un veut aller plonger dans la plus compliquée lambda, veuillez le faire.
Vous devez vous connecter pour publier un commentaire.
"délégué += méthode" est l'opérateur délégué multicast de combiner la méthode de déléguer.
Dans l'autre main "délégué -= méthode" est un opérateur de retirer la méthode de délégué.
Il est utile pour l'Action.
Dans ce cas, seule la Method1 et Method3 sera exécuté, Method2 ne fonctionnera pas parce que vous retirez la méthode avant d'appeler le délégué.
Si vous utilisez délégué multicast avec la touche Func, le résultat sera la dernière méthode.
Dans ce cas, le résultat sera 3, étant donné que la méthode "() => 3" est le dernier ajout de la méthode de déléguer. De toute façon toutes les méthode sera appelée.
Dans votre cas, la méthode "t => t.Montant < 100" sera efficace.
Si vous souhaitez combiner le prédicat, je vous suggère de ces méthodes d'extension.
Utilisation
EDIT: corriger le nom de l'extension des méthodes comme Keith suggèrent.
Lorsque vous utilisez += ou -= lorsque le délégué types, qui donne juste un appel à
Delegate.Combine
etDelegate.Remove
.La chose importante à propos de la multidiffusion des délégués est que la valeur de retour de tous, mais le dernier exécuté délégué est ignoré. Ils ont tous été exécuté (sauf si une exception est levée), mais seule la dernière valeur de retour est utilisé.
Pour les prédicats, vous pourriez faire quelque chose comme:
Vous pouvez faire:
EDIT: Voici un plus générale de la solution qui est assez amusant, même si un peu bizarre...
De sorte que vous pourrait puis mettre en œuvre Et comme:
(Personnellement, je préfère cela à l'aide
GetInvocationList()
, parce que vous vous retrouvez avec un prédicat vous pouvez passer à d'autres bits de LINQ etc.)aggregator
paramètre doit venir avant ledelegates
paramètre, correct? J'ai pensé à uneparams
paramètre toujours dû être la dernière.En fait, cela ne fonctionne pas. Essayez de le tester avec un cas où la première condition ÉCHOUE, mais la deuxième passe. Vous trouverez qu'il va retourner la valeur true. La raison en est, car lorsque vous traitez avec de multidiffusion délégués que les valeurs de retour, seule la dernière valeur est retournée. Par exemple:
Cela permettra de retourner la valeur TRUE parce que le dernier appel de la fonction renvoie la valeur vrai (il est à moins de 20). Afin de bien faire ce travail, vous devez appeler:
qui retourne un tableau de délégués. Ensuite, vous devez vous assurer qu'ils reviennent TOUS vrai, pour le résultat final pour être vrai. Un sens?
Expansion sur alibres bd'agir de réponse (+1 il)
Si vous voulez obtenir le comportement que vous cherchez, vous devez explicitement de la chaîne de l'ensemble des prédicats. Voici un exemple
Si vous souhaitez combiner des prédicats, essayez ceci;
Vous appeler comme ça,
L' += est sucre syntaxique spécifiquement mis en œuvre pour soutenir l'ajout de gestionnaires d'événements. Étant donné que les événements sont un cas particulier de délégué, et Func est également un délégué, la syntaxe apparaît de travailler ici.
Mais êtes-vous sûr qu'il fonctionne comme prévu? Je veux dire par là, ne vous attendez une ET ou de OU de l'évaluation? Comment voulez-vous mettre en œuvre le contraire si vous en avez toujours rêvé? Êtes-vous sûr que ce n'est pas juste de retourner le résultat de la première? Ou le dernier?