首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Any()方法动态构建LINQ过滤器?

为Any()方法动态构建LINQ过滤器?
EN

Stack Overflow用户
提问于 2013-04-26 10:20:59
回答 3查看 648关注 0票数 4

Any()接受一个Func函数,我如何动态地为它建立过滤器?即:

代码语言:javascript
运行
复制
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>列表的代码,但由于不知道如何将其转换为toFunc,因此无法正常工作

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-26 10:30:15

您可以通过调用当前滤镜中的其他滤镜来编写滤镜,如下所示:

代码语言:javascript
运行
复制
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);
}

这是打印

代码语言:javascript
运行
复制
quick
fox

Demo on ideone

您可以对任何基于谓词的LINQ函数使用相同的方法,包括Any

代码语言:javascript
运行
复制
if (input.Any(filter2)) {
    ...
}
票数 3
EN

Stack Overflow用户

发布于 2013-04-26 10:24:12

您可以在Any中添加多个过滤器,如下所示。

代码语言:javascript
运行
复制
list.Any(a=>a.Text == "ok" && a.ID == 5);
票数 0
EN

Stack Overflow用户

发布于 2013-04-27 00:27:17

您可以创建一个IEnumerable<Func<T,bool>>,然后查询它,例如

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16227743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档