C#中将List<IEnumerable<int>>转换为List<int>的更优雅实现方案咨询
你可以直接用LINQ的SelectMany方法实现嵌套集合的展平,一步得到目标List<int>,代码可以精简为:
List<int> list = FolderRepository.GetAll() .Where(c => folderIds.Contains(c.Id)) .SelectMany(x => x.Categories.Select(y => y.Id)) .ToList();
说明
SelectMany是LINQ专门用来处理嵌套序列展平的方法,直接将你原来Select得到的IEnumerable<IEnumerable<int>>类型的嵌套集合拍平为一维IEnumerable<int>,省去了手动声明临时集合、循环调用AddRange的冗余步骤。- 原代码Where条件中的
folderIds.Any(y => y == c.Id)可以替换为folderIds.Contains(c.Id),语义更直白,可读性更高。如果是配合EF/EF Core这类ORM做数据库查询,这个写法还能直接翻译成SQL执行,避免内存中二次遍历的性能损耗。
如果不想调整原有查询的写法,也可以对已经得到的folderCategoriesIds直接做展平处理:
var folderCategoriesIds = FolderRepository.GetAll().Where(c => folderIds.Any(y => y == c.Id)).Select(x => x.Categories.Select(y => y.Id)).ToList(); List<int> list = folderCategoriesIds.SelectMany(x => x).ToList();
内容的提问来源于stack exchange,提问作者Stella Esparza
相关产品推荐
相关产品推荐

