Метод с предикатом в качестве параметра - PullRequest
8 голосов
/ 03 августа 2010

Это общий вопрос, но вот конкретный случай, в котором я ищу решение:

У меня есть Dictionary<int, List<string>>, к которому я хочу применить различные предикаты. Я хочу один метод, который может заботиться о нескольких запросах LINQ, таких как эти:

from x in Dictionary
where x.Value.Contains("Test")
select x.Key

from x in Dictionary
where x.Value.Contains("Test2")
select x.Key

Итак, я ищу такой метод:

public int GetResult(**WhatGoesHere** filter)
{
    return from x in Dictionary.Where(filter)
           select x.Key;
}

Для использования следующим образом:

int result;

result = GetResult(x => x.Value.Contains("Test"));
result = GetResult(x => x.Value.Contains("Test2"));

Каков правильный синтаксис для WhatGoesHere ?

1 Ответ

15 голосов
/ 03 августа 2010

Вы можете использовать Func<KeyValuePair<int, List<string>>, bool>:

public int GetResult(Func<KeyValuePair<int, List<string>>, bool> filter)
{
    return (from x in Dictionary
            where filter(x)
            select x.Key).FirstOrDefault();
}

Или альтернативно: Predicate<KeyValuePair<int, List<string>>>. Я думаю, что Func, который был представлен в .NET 3.5, предпочтительнее в наши дни.

Вы используете x для обозначения двух разных вещей в вашем последнем примере, и это даст ошибку компиляции. Попробуйте заменить один из x на другой:

x = GetResult(y => y.Value.Contains("Test1"));
...