如何编写LINQ筛选包含pairs任一子列表所有元素的cases列表?
解决方法
首先明确核心需求:从cases集合里,找出那些包含pairs中任意一个子列表所有元素的列表。
为什么你的代码没效果?
你之前的代码有两个关键问题:
- 筛选对象搞反了:你在遍历
pairs做筛选,但实际要找的是cases里的元素; - 逻辑判断完全反了:
cases.All(...)要求所有case都包含当前pair,但你需要的是当前case能包含至少一个pair的所有元素。
正确的LINQ写法
基础实现(适合小数据量)
直接按需求逻辑写,容易理解:
var res = cases.Where(caseItem => pairs.Any(pair => pair.All(element => caseItem.Contains(element))) ).ToList();
逻辑拆解:
- 逐个检查
cases里的每个列表(caseItem); - 对每个
caseItem,看pairs里有没有至少一个子列表(pair),能让这个pair的所有元素都在caseItem里; - 符合条件的
caseItem就会被保留下来。
性能优化版(适合大数据量)
如果数据规模大,把case转换成HashSet<string>能大幅提升查找效率(HashSet.Contains()是O(1),比List.Contains()的O(n)快很多):
// 先把每个case转成HashSet,避免重复计算 var caseHashSets = cases.Select(c => new HashSet<string>(c)).ToList(); var res = cases.Zip(caseHashSets, (originalCase, hashSet) => new { originalCase, hashSet }) .Where(item => pairs.Any(pair => pair.All(element => item.hashSet.Contains(element)))) .Select(item => item.originalCase) .ToList();
测试结果
用你给出的测试数据,上面的代码会正确返回cases里的第四个列表:{"u", "c", "b", "w", "z"}——因为它完全包含pairs里的{"u", "z"}。
内容的提问来源于stack exchange,提问作者bakunet
相关产品推荐
相关产品推荐

