2010-08-03 4 views
8

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

У меня есть 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?

+0

Входы, я пропустил правильный тип. Я удалил свой ответ. Ответ Марка Байера хорош. – zneak

ответ

14

Вы можете использовать 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 был preferred в эти дни.

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

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

А, я думал, что я на правильном пути. Я делал Predicate >>, но я думаю, что это не имеет большого смысла. Благодарю. – Ocelot20

Смежные вопросы