谓词作为参数的方法

时间:2010-08-03 19:04:11

标签: c# .net linq linq-to-objects 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 的正确语法是什么?

1 个答案:

答案 0 :(得分:15)

您可以使用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>>>。我认为.NET 3.5中引入的Func目前是preferred

您在最后一个示例中使用x表示两个不同的内容,这会产生编译错误。尝试将其中一个x更改为其他内容:

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