从列表获取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>的构造函数只接受两种参数:
- 单层的
IEnumerable<string>(也就是一串字符串) - 一个
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




