You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从列表获取UnitNo属性时遇类型转换错误:IEnumerable转IEqualityComparer失败

问题分析与解决

嘿,我一眼就看出问题所在啦!你遇到的类型转换错误,根源是嵌套的Select导致返回了多层枚举类型,和HashSet<string>需要的参数不匹配。

错误原因拆解

你写的这段代码:

var UnitNo = new HashSet<string>(vesUnits.Select(s1 => s1.UnitBeds.Select(s2 => s2.UnitNo)));

里面的vesUnits.Select(...)返回的是IEnumerable<IEnumerable<string>>——简单说就是“字符串列表的列表”,但HashSet<string>的构造函数只接受两种参数:

  1. 单层的IEnumerable<string>(也就是一串字符串)
  2. 一个IEqualityComparer<string>类型的比较器

编译器看到你传了多层枚举,误以为你想传比较器,就报了“无法转换为IEqualityComparer<string>”的错误。另外还有个小问题:你定义的变量是units,但代码里写的是vesUnits,这也会导致变量未定义的错误哦。

修正方案

要把多层枚举扁平化成单层的,用SelectMany代替外层的Select就可以了!SelectMany的作用就是把嵌套的集合“摊平”成单层集合。

修正后的完整代码:

static int Main(string[] args) 
{
    List<UnitSyncModelSchema> units = GetUnitById();
    // 这里用SelectMany替代外层Select,同时修正变量名
    var unitNoSet = new HashSet<string>(units.SelectMany(s1 => s1.UnitBeds.Select(s2 => s2.UnitNo)));
}

如果想更简洁一点,还可以写成:

var unitNoSet = new HashSet<string>(units.SelectMany(u => u.UnitBeds.Select(b => b.UnitNo)));

这样就能正确获取所有UnitNo并存入HashSet啦~

内容的提问来源于stack exchange,提问作者ichachan

火山引擎 最新活动