Il y a quelques mauvaises choses ici:
Predicate<double>
n'est pas un type approprié d'utiliser comme TKey
. La clé pour un dictionnaire est supposé identifier une valeur, ne pas calculer une valeur.
Cela n'aurait aucun sens d'utiliser lambdas non plus. Parce qu'ils sont anonymes, vous n'obtiendrez aucune équivalence et vous ne pourrez pas utiliser un dictionnaire.
Voir cet exemple de code pour une illustration:
Predicate<double> fn_1 = d => d == 34.0d;
Predicate<double> fn_2 = d => d == 34.0d;
// Note: There are not equal
if (fn_1 == fn_2)
Console.WriteLine("These are Equal?");
Si quoi que ce soit, vous pouvez utiliser une liste de délégués et d'exécuter chacun pour trouver ceux qui correspondent, mais à ce moment-là, vous devez attendre plusieurs résultats. Si vous voulez seulement obtenir un résultat unique, alors vous devez considérer quels ordre les prédicats sont stockés dans votre liste.
Ne pas abuser KeyValuePair
comme un hack pour ne pas avoir Tuple<T1,T2>
. Il serait assez facile de créer une classe qui a à la fois un Predicate et un SomeStruct. Regardez:
public class MySegment
{
public Predicate<double> Predicate {get;set;}
public SomeStruct Result {get;set;}
}
passer par une séquence de prédicats, et trouver ceux correspondant ressemblerait à ceci:
...
List<MySegment> list = new List<MySegment>();
...
list.Add(new MySegment { Predicate = d => d < 10, Result = SomeStruct.Foo });
list.Add(new MySegment { Predicate = d => d > 90, Result = SomeStruct.Bar });
...
public IEnumerable<SomeStruct> GetResults(double input)
{
foreach (var item in list)
if (item.Predicate(input))
yield return item.Result;
}
Ce n'est pas comment utiliser une table de hachage. – leppie
@leppie: D'accord. Dans mon cas, c'est juste un 'List>' (je ne peux pas utiliser 4.0 et 'List >') - –
abatishchev
Ce n'est pas comment utiliser lambdas. –