You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向LINQ Where子句添加多个Func<IDictionary<string,object>,bool>谓词?

解决LINQ Where子句多谓词仅最后一个生效的问题

你的问题出在循环过滤的逻辑上:每次执行filteredTransactions = transactionList.Where(filter).ToList();时,都是从原始的transactionList重新执行过滤,而不是在上一次过滤后的结果基础上继续筛选。这就导致之前的过滤结果被覆盖,最终只剩最后一个谓词生效。

两种可行的修复方案

方案一:逐步累积过滤(依次应用每个谓词)

初始化时先复制原始列表,之后每次都基于上一次的过滤结果继续筛选:

// 先把原始列表赋值给过滤结果
filteredTransactions = transactionList.ToList();

foreach (Func<IDictionary<string, object>, bool> filter in p)
{
    // 在上一次过滤的结果上应用新的谓词
    filteredTransactions = filteredTransactions.Where(filter).ToList();
}

方案二:合并所有谓词为一个(所有条件同时满足)

用Aggregate把多个谓词合并成一个逻辑上的**与(AND)**条件,只需要执行一次Where:

// 合并所有谓词,要求所有条件都满足
var combinedPredicate = p.Aggregate((currentFilter, nextFilter) => item => currentFilter(item) && nextFilter(item));

filteredTransactions = transactionList.Where(combinedPredicate).ToList();

如果需要的是**或(OR)**关系(满足任意一个谓词即可),把代码中的&&替换成||即可。

补充说明

两种方案的区别:

  • 方案一适合需要按顺序逐步筛选的场景,比如前一个过滤的结果会影响后一个谓词的执行范围
  • 方案二更高效,因为只需要遍历一次原始列表,适合所有谓词是并列条件的场景

内容的提问来源于stack exchange,提问作者K N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:07:41