如何打印嵌套列表值并查询唯一Feature?IEnumerable<IEnumerable>问题
针对你遇到的嵌套列表遍历和去重问题,我来一步步帮你解决:
问题1:如何循环打印description属性
不管是从原始的resultado.Hotels集合,还是处理后的listaServices,都可以通过嵌套循环或者扁平化处理来打印Description属性:
方式1:直接遍历原始Hotels数据
// 逐个遍历每个酒店的Features集合 foreach (var hotel in resultado.Hotels) { foreach (var feature in hotel.Features) { Console.WriteLine(feature.Description); // 替换成你需要的输出逻辑,比如绑定到UI控件 } }
方式2:遍历处理后的listaServices
因为你的listaServices是IEnumerable<IEnumerable<RS.Feature>>类型,需要两层循环才能拿到每个Feature的Description:
foreach (var serviceGroup in resultadoFiltro.listaServices) { foreach (var service in serviceGroup) { Console.WriteLine(service.Description); } }
如果想简化操作,可以先用SelectMany把嵌套集合扁平化为单个列表,再遍历:
// 扁平化所有Feature,提取Description var allDescriptions = resultadoFiltro.listaServices .SelectMany(group => group) .Select(feature => feature.Description); foreach (var desc in allDescriptions) { Console.WriteLine(desc); }
问题2:查询唯一值(解决去重失败的问题)
你当前的去重代码无效,核心原因是:Distinct()默认比较对象的引用地址,每个酒店的Feature都是独立的实例,哪怕Code和Description完全一致,也会被判定为不同对象。要实现按属性去重,有两种实用方案:
方案1:使用DistinctBy(.NET 6+推荐)
DistinctBy可以直接指定用来判断唯一性的属性(推荐用Code,因为它是业务上的唯一标识,比Description更可靠):
// 合并所有酒店的Features为单个集合,再按Code去重 var uniqueServices = resultado.Hotels .SelectMany(hotel => hotel.Features) // 扁平化嵌套集合 .DistinctBy(feature => feature.Code); // 按Code去重 // 酒店类型的去重逻辑(如果h.Type是Feature集合就用SelectMany,单个Feature就用Select) var uniqueHotelTypes = resultado.Hotels .SelectMany(hotel => hotel.Type) .DistinctBy(type => type.Code); // 赋值给模型:如果你的业务不需要嵌套结构,建议把listaServices改成IEnumerable<RS.Feature> model resultadoFiltro = new model() { listaServices = new List<IEnumerable<RS.Feature>> { uniqueServices }, // 或者优化模型后直接赋值:listaServices = uniqueServices.ToList() };
*注意:*如果你的项目基于.NET 5或更早版本,无法使用DistinctBy,可以采用下面的方案。
方案2:自定义IEqualityComparer<Feature>
实现一个比较器,告诉Distinct()如何判断两个Feature是否相同:
public class FeatureEqualityComparer : IEqualityComparer<Feature> { public bool Equals(Feature x, Feature y) { // 按Code判断唯一性,也可以加上Description做双重验证 if (x == null && y == null) return true; if (x == null || y == null) return false; return x.Code == y.Code; } public int GetHashCode(Feature obj) { // 基于Code生成哈希码,确保相同Code的Feature哈希码一致 return obj.Code?.GetHashCode() ?? 0; } }
然后在调用Distinct()时传入这个比较器:
var uniqueServices = resultado.Hotels .SelectMany(hotel => hotel.Features) .Distinct(new FeatureEqualityComparer()); var uniqueHotelTypes = resultado.Hotels .SelectMany(hotel => hotel.Type) .Distinct(new FeatureEqualityComparer());
额外优化建议
你的listaServices定义为IEnumerable<IEnumerable<RS.Feature>>,但去重后其实是一个扁平的唯一集合,建议修改模型结构:
// 把嵌套集合改成单个集合,更符合去重后的业务场景 public IEnumerable<RS.Feature> listaServices { get; set; }
这样后续遍历和数据绑定都会更简洁,不需要处理嵌套层级。
内容的提问来源于stack exchange,提问作者Qiqke
相关产品推荐
相关产品推荐

