如何为IEnumerable<IDictionary<string,object>>追加过滤结果而非替换?
过滤器结果追加的实现方案
核心问题在于原逻辑是逐步缩小过滤范围(逻辑与/AND),每次循环用当前过滤器替换结果;要实现追加整合符合任一条件的结果(逻辑或/OR),可以按以下两种方式修改:
方式一:循环追加(适合需要分步处理的场景)
先初始化空列表存储结果,每次过滤出当前条件匹配的数据后追加,可选去重:
public IEnumerable<IDictionary<string, object>> FilterData(IEnumerable<IDictionary<string, object>> originalData, List<KeyValuePair<string, object>> filters) { var result = new List<IDictionary<string, object>>(); foreach (var filter in filters) { // 筛选符合当前键值对条件的数据 var matchedItems = originalData.Where(dict => dict.ContainsKey(filter.Key) && dict[filter.Key].Equals(filter.Value) ); // 追加到结果,同时排除已存在的项(去重),不需要去重则直接用 result.AddRange(matchedItems) result.AddRange(matchedItems.Except(result)); } return result; }
方式二:LINQ 简洁写法(推荐,高效直接)
用Any方法一次性筛选出符合任一过滤器条件的数据,自动实现OR逻辑且无重复:
public IEnumerable<IDictionary<string, object>> FilterData(IEnumerable<IDictionary<string, object>> originalData, List<KeyValuePair<string, object>> filters) { return originalData.Where(dict => filters.Any(filter => dict.ContainsKey(filter.Key) && dict[filter.Key].Equals(filter.Value) ) ); }
关键说明
- 原逻辑错误点:
result = result.Where(...)是将结果替换为当前过滤后的子集,相当于"同时满足所有过滤器"; - 新逻辑核心:要么循环收集每个过滤器的匹配项并合并,要么用
Any判断数据是否符合任一过滤器条件,最终得到所有符合至少一个过滤规则的记录。
内容的提问来源于stack exchange,提问作者digitala
相关产品推荐
相关产品推荐

