【问题标题】:Dynamically build LINQ filter for the Any() method?为 Any() 方法动态构建 LINQ 过滤器?
【发布时间】:2013-05-01 03:55:49
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

标签: linq dynamic filter


【解决方案1】:

您可以通过调用当前过滤器中的其他过滤器来组合过滤器,如下所示:

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

Demo on ideone.

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

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

【讨论】:

    【解决方案2】:

    您可以创建一个IEnumerable&lt;Func&lt;T,bool&gt;&gt; 然后查询它,例如

    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} ) );
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我需要多个过滤器。我将更新我的原始帖子以包含不同的表达方式
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多