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

C#如何从嵌套列表生成逗号分隔的产品ID字符串?

需求:实现获取逗号分隔的产品ID字符串

我有一个List<BookingModel>?类型的对象列表,每个BookingModel包含一个Products对象列表,需要编写方法提取所有非空的ProductID,并返回逗号分隔的字符串。

目前用foreach循环的代码可以正常运行:

private static string GetProductIDs(List<BookingModel>? Bookings)
{
    List<long> ProductIDS = new List<long>();
    foreach (var booking in Bookings)
    {
        var products = booking?.Products ;
        if (products != null)
        {
            foreach (var product in products)
            {
                if (product.ProductID != null)
                {
                    ProductIDS.Add((long)product.ProductID);
                }
            }
        }   
    }
    return string.Join(",", ProductIDS.ToArray());
}

但尝试用LINQ的SelectMany写法时出现错误:

var test = Bookings.SelectMany(c => c.Products.Where(p => p.ProductID != null)
    .Select(t => t.ProductID))
    .ToList();
			
return string.Join(",", test.ToArray());

错误核心原因:

  1. Bookings可能为null,直接调用SelectMany会触发空引用异常
  2. 单个booking的Products可能为null,调用Where会触发空引用异常
  3. ProductID是可空类型,未做类型转换就直接拼接会导致类型不匹配

最优LINQ实现方案

private static string GetProductIDs(List<BookingModel>? Bookings)
{
    var productIds = Bookings?
        .SelectMany(booking => booking?.Products ?? Enumerable.Empty<ProductModel>())
        .Where(product => product.ProductID.HasValue)
        .Select(product => product.ProductID.Value)
        .ToList() ?? new List<long>();

    return string.Join(",", productIds);
}

方案说明

  • Bookings?:处理Bookings为null的情况,避免空引用异常
  • booking?.Products ?? Enumerable.Empty<ProductModel>():当单个booking的Products为null时,用空集合替代,保证后续LINQ操作正常执行
  • .Where(product => product.ProductID.HasValue):过滤掉ProductID为空的项,和原foreach逻辑完全一致
  • .Select(product => product.ProductID.Value):将可空的ProductID转换为long类型,匹配原代码的类型要求
  • ?? new List<long>():处理Bookings为null时返回空集合,确保string.Join能正常生成空字符串

如果需要对产品ID去重(原逻辑未做去重,若有需求可添加),只需在Select之后追加.Distinct()即可。

内容的提问来源于stack exchange,提问作者its me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:45:26