Есть несколько вещей, здесь не так:
Predicate<double>
не является подходящим типом для использования в качестве TKey
. Ключ для словаря должен быть идентифицировать значение, а не вычислять значение.
Это не имеет никакого смысла, используя лямбда. Поскольку они анонимны, вы не получите никакой эквивалентности и не сможете использовать словарь.
Смотрите этот пример кода для иллюстрации:
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?");
Если что-нибудь, вы можете использовать список делегатов и выполнить каждый из них, чтобы найти те, которые соответствуют, но в этот момент вы должны ожидать несколько результатов. Если вы хотите получить только один результат, то вы должны рассмотреть, какой заказывать предикаты хранятся в вашем списке.
Не злоупотребляйте KeyValuePair
как взломанный для не имеющего Tuple<T1,T2>
. Было бы довольно легко создать класс, в котором есть как Predicate, так и SomeStruct. Смотри:
public class MySegment
{
public Predicate<double> Predicate {get;set;}
public SomeStruct Result {get;set;}
}
Чтобы пройти через последовательность предикатов, и найти соответствующие из них будет выглядеть следующим образом:
...
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;
}
Это не то, как использовать хэш-таблицу. – leppie 2010-11-29 20:03:15
@leppie: Согласен. В моем случае это просто «Список>» (я не могу использовать 4.0 и `List >`) - –
abatishchev
2010-11-29 20:11:52
Это не то, как использовать lambdas. – 2010-11-29 20:12:47