如何用Lambda/LINQ将对象列表中的嵌套列表合并为单个列表
使用LINQ/Lambda实现嵌套列表的筛选合并
针对你需求的筛选合并功能,用LINQ可以非常简洁地实现,以下是几种可行方案:
最健壮的写法(处理Strings为null的情况)
List<string> strings = Xis .Where(x => x.Strings != null && x.Strings.Any()) .SelectMany(x => x.Strings) .ToList();
代码说明:
Where(x => x.Strings != null && x.Strings.Any()):先过滤掉Strings为null或空列表的X对象,避免空引用异常SelectMany:LINQ的扁平化方法,会把每个符合条件的x.Strings中的元素逐一提取,合并成一个连续的序列ToList():将最终的序列转换为List<string>,和你原来foreach实现的结果完全一致
简化写法(确定Strings永远不为null时)
如果能保证所有X对象的Strings属性不会为null,只需要判断列表是否有元素,可以简化为:
List<string> strings = Xis .Where(x => x.Strings.Any()) .SelectMany(x => x.Strings) .ToList();
查询表达式风格写法
如果你习惯LINQ查询表达式的语法,也可以这样写:
List<string> strings = (from x in Xis where x.Strings != null && x.Strings.Any() from s in x.Strings select s).ToList();
对比原foreach实现
这些LINQ写法属于声明式编程,你只需要描述"要筛选什么、要合并什么",不需要手动管理集合的添加逻辑,代码更简洁易读,同时也保留了原逻辑的功能。
内容的提问来源于stack exchange,提问作者Doug
相关产品推荐
相关产品推荐

