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());
错误核心原因:
Bookings可能为null,直接调用SelectMany会触发空引用异常- 单个
booking的Products可能为null,调用Where会触发空引用异常 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
相关产品推荐
相关产品推荐

