You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打印嵌套列表值并查询唯一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:32:31