C#如何判断列表对象某属性的所有值都在另一列表中
问题描述
现有代码逻辑为判断listA所有元素的myHouseNumber等于"1"或myValue等于"2",现需修改为:当listA中每个元素的myHouseNumber值都存在于listB(仅包含数字的列表)中时,条件返回true。
示例场景:
- 符合条件:
listA包含Bill,1,Main和Ted,2,Second,listB包含1,2,3→ 返回true - 不符合条件:
listB包含1,5,9→Ted的myHouseNumber=2不在listB中,返回false
用户尝试的错误代码:
if(listA.All(x => x.myHouseNumber.Contains(listB.Any()))) { //do something }
正确解决方案
首先注意类型匹配:myHouseNumber是字符串类型,listB是数字列表(假设为int类型),需先做类型兼容处理,以下分场景给出实现:
场景1:listB为List<int>类型
方案1:实时转换myHouseNumber为int判断
if (listA.All(x => int.TryParse(x.myHouseNumber, out int houseNum) && listB.Contains(houseNum))) { // 执行逻辑 }
- 用
int.TryParse避免转换失败抛出异常,确保代码健壮性
方案2:预转换listB为字符串集合(更高效)
如果listB不会频繁变更,先转成字符串集合,避免每次循环重复转换:
var listBString = listB.Select(num => num.ToString()).ToList(); if (listA.All(x => listBString.Contains(x.myHouseNumber))) { // 执行逻辑 }
场景2:listB为List<string>类型
直接判断即可:
if (listA.All(x => listB.Contains(x.myHouseNumber))) { // 执行逻辑 }
错误代码原因分析
你写的x.myHouseNumber.Contains(listB.Any())存在两处问题:
- 类型不匹配:
listB.Any()返回布尔值(表示列表是否有元素),而string.Contains()需要传入字符串参数 - 逻辑颠倒:你需要判断的是
listB中是否包含当前元素的myHouseNumber,而非myHouseNumber包含listB的某个状态
性能优化建议
如果listB数据量较大,建议将其转为HashSet,因为HashSet.Contains()的时间复杂度为O(1),远优于List.Contains()的O(n):
// 针对int类型listB var houseNumSet = new HashSet<int>(listB); if (listA.All(x => int.TryParse(x.myHouseNumber, out int houseNum) && houseNumSet.Contains(houseNum))) { // 执行逻辑 } // 针对string类型listB var houseNumStringSet = new HashSet<string>(listB); if (listA.All(x => houseNumStringSet.Contains(x.myHouseNumber))) { // 执行逻辑 }
内容的提问来源于stack exchange,提问作者Gazrok
相关产品推荐
相关产品推荐

