如何使用LINQ的Any方法判断Cars类CarEquipment与Customers类OwnedEquipment是否匹配
错误原因
你的原有代码出错的核心原因是Cars.Select(x=>x.CarEquipment)返回的是IEnumerable<List<string>>类型,也就是嵌套的字符串集合序列,而非所有汽车设备的扁平字符串集合,无法直接和客户的OwnedEquipment字符串做包含判断。
实现方案
以下默认cars是Cars类的实例集合,customers是Customers类的实例集合。
方案1:使用Intersect直接判断交集(代码最简洁)
先通过SelectMany将所有汽车的CarEquipment嵌套集合打平为一维字符串序列,再和客户所有的OwnedEquipment集合求交集,只要交集不为空就说明存在匹配项:
bool hasMatchedEquipment = cars.SelectMany(c => c.CarEquipment) .Intersect(customers.Select(cu => cu.OwnedEquipment)) .Any();
方案2:适配原有写法的调整版本
如果要沿用你原有Any+Contains的写法,只需要把第一层的Select替换为SelectMany即可:
bool hasMatchedEquipment = cars.SelectMany(c => c.CarEquipment) .Any(customers.Select(cu => cu.OwnedEquipment).Contains);
大数据量优化方案
如果你的集合数据量较大,建议先把客户的设备集合转为HashSet,将Contains操作的时间复杂度从O(n)降到O(1),大幅提升查询效率:
HashSet<string> customerEquipmentSet = customers.Select(cu => cu.OwnedEquipment).ToHashSet(); bool hasMatchedEquipment = cars.SelectMany(c => c.CarEquipment).Any(customerEquipmentSet.Contains);
内容的提问来源于stack exchange,提问作者Slide
相关产品推荐
相关产品推荐

