如何使用Linq按指定属性匹配嵌套子列表与第三方列表
C# 嵌套子列表双属性匹配LINQ实现方案
核心思路
你原有写法直接调用Equals是引用类型比较,不会对比内部属性值,因此无法得到预期结果。要实现CurrentClothes列表和Human的clothings子列表的Garment、Color双属性完全匹配,需要同时满足两个条件:
- 两个列表的元素数量完全一致
- 两个列表的
Garment+Color属性组合完全重合,不存在多余或缺失的组合
代码实现
方案1:不要求元素顺序匹配(推荐,符合衣物集合的常规使用场景)
// 先将待匹配的目标集合转属性组合哈希集,提升比对效率 var matchSet = currentclothes .Select(c => new { c.Garment, c.Color }) .ToHashSet(); // 查询匹配的Human集合 List<Human> matchedHumans = humans .Where(h => // 先校验数量一致,快速过滤不符合的对象 h.clothings.Count == currentclothes.Count // 校验所有衣物的属性组合都在目标集合中 && h.clothings.Select(c => new { c.Garment, c.Color }).All(matchSet.Contains) ) .ToList();
你的示例中该查询会正确返回Paula对应的Human对象。
方案2:要求元素顺序严格匹配
如果业务要求两个列表的元素顺序也必须完全对应,可以使用SequenceEqual方法:
List<Human> matchedHumans = humans .Where(h => h.clothings.Select(c => new { c.Garment, c.Color }) .SequenceEqual(currentclothes.Select(c => new { c.Garment, c.Color })) ) .ToList();
内容的提问来源于stack exchange,提问作者T0bi
相关产品推荐
相关产品推荐

