如何基于谓词列表为BindingListView构建组合过滤条件?
组合Predicate列表构建BindingListView过滤条件
要将多个Predicate<DemoClass>组合成一个逻辑与(对应原示例的&&)的过滤条件,直接传给ApplyFilter,可以用以下两种方式实现:
方式一:用LINQ Aggregate简化组合
利用LINQ的Aggregate方法,自动将列表中的所有谓词依次用逻辑与连接:
// 组合所有谓词为单个逻辑与谓词 var combinedPredicate = predicates.Aggregate((current, next) => dc => current(dc) && next(dc)); // 应用到BindingListView view.ApplyFilter(combinedPredicate);
方式二:手动遍历实现(更直观)
如果想更清晰地控制组合逻辑,可以手动遍历谓词列表,逐个验证:
Predicate<DemoClass> combinedPredicate = dc => { foreach (var predicate in predicates) { // 任意一个谓词不满足则整体不满足 if (!predicate(dc)) return false; } // 所有谓词都满足才返回true return true; }; view.ApplyFilter(combinedPredicate);
补充说明
如果需要改为**逻辑或(||)**的组合逻辑,只需要调整判断逻辑:
- 方式一中把
&&替换为|| - 方式二中把判断改为
if (predicate(dc)) return true;,最后返回false
内容的提问来源于stack exchange,提问作者ShamilS
相关产品推荐
相关产品推荐

