如何无需遍历C#字典,提取FileNameId=7的项到新字典?
解决方案
要实现将原字典中FileNameId等于7的项提取到新字典,你可以借助LINQ的声明式语法来避免显式编写foreach循环(底层仍会遍历,但代码更简洁):
代码实现
首先确保引入LINQ命名空间:
using System.Linq;
然后生成目标字典:
// 生成包含所有键的新字典,对应值为筛选后的列表(保留空列表的键) Dictionary<string, List<FirstReportsData>> dicFsrFileNameId7 = dicFsrFileNameId1 .ToDictionary( kvp => kvp.Key, kvp => kvp.Value?.Where(item => item.FileNameId == 7).ToList() ?? new List<FirstReportsData>() ); // 如果需要过滤掉值列表为空的键值对,可追加以下步骤 dicFsrFileNameId7 = dicFsrFileNameId7 .Where(kvp => kvp.Value.Any()) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
关键说明
ToDictionary会遍历原字典的每个键值对,对每个值列表执行Where筛选,只保留FileNameId == 7的项并转为新列表。- 代码中加入了
kvp.Value?和?? new List<FirstReportsData>()的空值处理,避免原字典中存在null列表时抛出空引用异常。 - 若不需要保留值为空列表的键,可通过
Where(kvp => kvp.Value.Any())过滤后再转字典。
需要注意:C#中不存在完全不遍历的方式——要筛选元素必须访问每个项,LINQ只是将遍历逻辑封装,无需显式编写循环而已。
内容的提问来源于stack exchange,提问作者Jason Livengood
相关产品推荐
相关产品推荐

