【问题标题】:Combine Lambda-Expressions dynamic for where将 Lambda 表达式动态组合到哪里
【发布时间】:2016-12-04 03:59:06
【问题描述】:

我有一个 lambda 表达式列表List<Func<SomeObject, bool>> filterList; 此过滤器列表用于过滤 SomeObject 的集合,如下所示:

List<SomeObject> randomList; //filled with random stuff

foreach (Func<SomeObject, bool> filter in filterlist)
    randomList = randomList.Where(filter).ToList();

现在我想组合一些过滤器 - 但我想将它们与 AND 或 OR 语句组合。 例如:用户有 3 个过滤器 A、B 和 C,并希望将它们组合成“A && (B || C)”。

我不知道该怎么做。

【问题讨论】:

  • 实际上你已经用 AND 组合了它们
  • 您如何知道何时与 AND 结合以及何时与 OR 结合?
  • 是的,但我想设置复杂的过滤器(例如“A && (B || C)”)。 :P
  • 我的过滤器列表还包含名称和 ID。用户选择了两个过滤器(B 和 C)并按下按钮“组合或”。现在我想识别这两个规则并将它们组合成一个新的规则。

标签: c# .net collections lambda


【解决方案1】:

您使用的是Func&lt;T&gt;,而不是Expression&lt;Func&lt;T&gt;&gt;,这使得无法“重写”它们,或者将多个函数组合成一个函数。所以你只能按照一定的顺序执行它们。

您已经在用 AND 组合它们。

要将两个(或更多)条件与 OR 结合,请执行以下操作:

randomList = randomList.Where(x => filter1(x) || filter2(x)).ToList();

要执行A &amp;&amp; (B || C),请执行以下操作:

randomList = randomList.Where(x => filterA(x) && (filterB(x) || filterC(x))).ToList();

【讨论】:

  • 好的,当我使用Expression&lt;Func&lt;SomeObject, bool&gt;&gt; - 我如何“重写”它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多