动态构建LINQ过滤器用于Any()方法?

4

Any()函数需要一个Func参数,如何动态构建过滤器?例如:

var filter = () a=> a.Text == "ok";//add the first filter
if (flag)
    filter += () a=> a.ID == 5;//add the second filter << obviously this doesn't work.

list.Any(filter);

我曾看到过一些代码可以结合Expression>列表使用,但是我无法将其转换为Func,因此无法使其工作。如有帮助,将不胜感激。

也许我提出的这个问题可以帮助你?http://stackoverflow.com/questions/12244208/spliting-up-long-linq-queries-for-improved-maintainability - eandersson
3个回答

3
您可以在当前过滤器中调用其他过滤器来组合过滤器,例如:
var input = new[] {"quick", "brown", "fox", "jumps"};
Func<string,bool> filter1 = a => a == "quick";
Func<string,bool> filter2 = a => filter1(a) || a.Length == 3;
foreach (var s in input.Where(filter2)) {
    Console.WriteLine(s);
}

这将打印

quick
fox

在 ideone 上查看演示

您可以使用相同的方法来处理与 LINQ 的基于谓词的函数相关的任何功能,包括 Any

if (input.Any(filter2)) {
    ...
}

0
你可以创建一个 IEnumerable<Func<T,bool>> 然后进行查询,例如:
Func<int,bool> isGreaterThanEight = x => x > 8;
Func<int,bool> isEven = x => x % 2 == 0;
Func<int,bool> hasFactorFive = x => x % 5 == 0;

IEnumerable<Func<int,bool>> rules = new List<Func<int,bool>>() 
    { isGreaterThanEight, isEven, hasFactorFive };

var nums = Enumerable.Range(1,10);

var actual = nums.Where( x => rules.Any( r => r(x) ) );

Assert.That( actual, Is.EqualTo( new[]{2,4,5,6,8,9,10} ) );

0

您可以像这样在Any中添加多个过滤器。

list.Any(a=>a.Text == "ok" && a.ID == 5);

我需要多个过滤器。我将更新我的原始帖子以包含不同的表达方式。 - Ryan Betker - healthNCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接