C# LINQ如何使用Contains方法实现跨集合多元素搜索
多元素列表包含判断的LINQ实现
你现有两个存储int类型数据的列表:
List<int> numberList = new List<int>() { 1, 2, 3, 4, 8, 10, 2};
List<int> numberListEnhanced = new List<int>() { 1, 2, 3, 5, 6};
目前你已经实现了单元素的Contains匹配,代码片段如下:
.....where numberListEnhanced.Contains((int)s.Id));
需要扩展为多元素的匹配校验,根据实际业务需求选对应写法即可:
- 需求1:只要
numberList中任意一个元素存在于numberListEnhanced中就判定匹配(交集判断)
直接在where子句中用Any()扩展方法实现:
如果列表数据量较大,或者是在EF Core这类数据库查询场景下使用,建议先把待匹配的列表转为HashSet减少重复遍历开销,性能提升会很明显:.....where numberList.Any(item => numberListEnhanced.Contains(item)));var matchSet = numberListEnhanced.ToHashSet(); .....where numberList.Any(item => matchSet.Contains(item))); - 需求2:
numberList中所有元素都存在于numberListEnhanced中才判定匹配(全量包含判断)
把Any()替换为All()扩展方法即可:
大数据量场景同样可以用HashSet优化:.....where numberList.All(item => numberListEnhanced.Contains(item)));var matchSet = numberListEnhanced.ToHashSet(); .....where numberList.All(item => matchSet.Contains(item)));
注意:你当前的
numberList中存在重复值(两个2),上述两种写法都可以正常处理重复值逻辑,不需要提前做去重操作,除非业务要求必须按去重后的值校验。如果是要校验实体对象s关联的集合属性,直接把代码里的numberList替换为s对应的集合属性即可。
内容的提问来源于stack exchange,提问作者test buddy
相关产品推荐
相关产品推荐

