You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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())存在两处问题:

  1. 类型不匹配:listB.Any()返回布尔值(表示列表是否有元素),而string.Contains()需要传入字符串参数
  2. 逻辑颠倒:你需要判断的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:40:38