2009-10-02 5 views
0

J'écris une méthode pilotée par table en C#. J'ai un dictionnaire de cette signature:Problème de méthode pilotée par table

Diction<Func<string, bool>, Func<string>> 

Il prendra une chaîne comme paramètre et me permettent d'exécuter une méthode qui retourne un bool sur la chaîne (par exemple String.length> 5). La valeur correspond aux méthodes qui retournent une chaîne.

Mais la méthode qui le fait prend une fonction en tant que paramètre. Je veux changer cela pour qu'il prenne une chaîne mais ensuite il regarde la longueur de la chaîne et obtient la bonne valeur du dictionnaire.

Quelque chose comme ceci:

dict[s.Length]; Or dict[s]; // Where s is a string 

Si elle est supérieure à 5, il obtient le Func qui exécute la méthode de la longueur> 5, sinon il obtient une autre fonct. Je veux éviter d'utiliser if/else car c'est un exercice pour sortir de cette habitude.

Je pourrais utiliser?: Mais ce n'est que pour deux conditions. La chose principale est que ceci est pour une API et je veux que l'utilisateur de l'API passe juste dans la chaîne en tant que paramètre, puis regarde la longueur et obtienne la bonne fonction du dictionnaire.

Comment dois-je procéder à ce sujet? Merci

+0

Vous voulez exécuter une fonction (retourner une chaîne et ne prend aucun argument) sur la base sur la longueur d'une chaîne? Ou basé sur un prédicat évalué pour la chaîne? –

Répondre

2

Il semble donc que vous n'utilisez réellement que le dictionnaire comme un ensemble de paires valeur/clé et que vous voulez évaluer la fonction "valeur" du premier prédicat "clé" qui renvoie vrai. Plutôt que d'un dictionnaire (puisque vous ne faites pas vraiment une recherche), j'utiliser un tableau (ici anonyme pour des raisons pratiques):

var map = new [] { 
    new { 
     Predicate = new Func<string, bool>(s => s.Length < 5), 
     Selector = new Func<string, string>(s => s + " is short.") 
    }, 
    new { 
     Predicate = new Func<string, bool>(s => true), 
     Selector = new Func<string, string>(s => s + " is long.") 
    } 
}; 

var input = "Long String"; 
var result = map.First(x => x.Predicate(input)).Selector(input); 
+0

Merci pour cela et excuses pour la réponse tardive (Très tard!). Comment l'utiliser dans une méthode? Cela ne fonctionne que dans un ctor. – dotnetdev

+0

Je ne suis pas tout à fait sûr de ce que vous voulez dire. La table des sélecteurs peut être initialisée dans un constructeur, votre classe fournissant une méthode qui prend en compte la valeur d'entrée et retourne le résultat de .First (...). Selector (input). – dahlbyk

Questions connexes