Combiner Plusieurs Prédicats
Est-il possible en c# .NET 2.0! pour combiner plusieurs Prédicats?
Disons que j'ai le code suivant.
List<string> names = new List<string>();
names.Add("Jacob");
names.Add("Emma");
names.Add("Michael");
names.Add("Isabella");
names.Add("Ethan");
names.Add("Emily");
List<string> filteredNames = names.FindAll(StartsWithE);
static bool StartsWithE(string s)
{
if (s.StartsWith("E"))
{
return true;
}
else
{
return false;
}
}
Cela me donne:
Emma
Ethan
Emily
Donc c'est plutôt cool, mais je sais voulez être en mesure de filtrer à l'aide de plusieurs prédicats.
Donc, je veux être en mesure de dire quelque chose comme ceci:
List<string> filteredNames = names.FindAll(StartsWithE OR StartsWithI);
Afin d'obtenir:
Emma
Isabella
Ethan
Emily
Comment puis-je y parvenir?
Actuellement, je suis juste filtrage de la liste complète deux fois et en combinant les résultats par la suite. Mais, malheureusement, c'est tout à fait inefficent et plus important encore, je perds l'ordre de tri d'origine, ce qui n'est pas acceptable dans ma situation.
J'ai aussi besoin d'être en mesure d'effectuer une itération sur un nombre illimité de filtres/prédicats comme il peut être tout à fait un lot.
Encore, il doit être un .NET 2.0 solution malheureusement je ne peux pas utiliser une version plus récente du cadre
Merci beaucoup.
Vous devez vous connecter pour publier un commentaire.
Comment sur:
Et complet:
Puis l'appeler avec:
Une autre alternative serait d'utiliser la multidiffusion délégués et ensuite les partager à l'aide de
GetInvocationList()
, puis faire la même chose. Alors que vous pourriez faire:Je ne suis pas un grand fan de la dernière approche, bien qu'il se sent comme un peu un abus de la multidiffusion.
return item => predicates.All(predicate => predicate(item));
Je suppose que vous pourriez écrire quelque chose comme ceci:
... et ainsi de suite.
Je viens récemment est venu avec une solution à ce problème, qui pourrait également être utile. J'ai développé la méthode FindAll pour les listes, ce qui me permet d'empiler des prédicats dans les listes que j'avais besoin:
Elle renvoie une liste des éléments correspondant à tous les prédicats. Bien sûr, il peut facilement être modifié OU tous les prédicats au lieu de ET. Mais avec ce seul on peut assembler tout à fait une bonne variété de combinaisons logiques.
Utilisation:
Dans .NET 2.0, il y a des délégués anonymes dont vous pourrez bénéficier de:
En fait, vous pouvez l'utiliser pour remplacer vos fonctions ainsi:
Vous pouvez créer une troisième prédicat en interne Rup les résultats ensemble. Je pense que vous pouvez le faire à la volée à l'aide d'une expression lambda. Quelque chose comme ceci(ce n'est pas une expression lambda que je ne suis pas trop bonne avec que snytax):
Vous pouvez rassembler le prédicat de la méthode dans une classe et ont le constructeur accepte un tableau de chaînes de caractères à tester:
Alors vous pouvez faire un appel comme ceci:
De cette façon, vous pouvez tester n'importe quelle combinaison de chaînes d'entrée sans avoir à étendre le code de base avec de nouvelles variations de la
StartsWith
méthode.Avoir utilisé ce modèle largement avec le ci-dessus 'params' méthode de la baie, j'ai été intrigué par récemment à l'apprentissage sur le délégué Multicast. Depuis délégués intrinsèquement charge une liste (ou multicast), vous pouvez ignorer les params[] modèle et il suffit de fournir un seul délégué à la fonction Test (). Vous aurez besoin de faire appel GetInvokationList fourni sur le Prédicat<>. Voir ceci: Délégué Multicast de type Func (avec une valeur de retour)?