C#新手求助:如何用LINQ从嵌套字典生成Dictionary<string, string>?
用LINQ从嵌套字典生成单层Dictionary<string, string>
首先纠正你伪代码里的问题:ForEach是无返回值的void方法,不能直接用来赋值生成新字典。我们可以通过LINQ的SelectMany和ToDictionary组合实现需求,以下是具体方案:
基础实现(假设无重复键)
如果嵌套结构中所有子键都是唯一的,直接展平所有嵌套键值对再转成字典即可:
Dictionary<string, IEnumerable<KeyValuePair<string, string>>> KvpValues = new Dictionary<string, IEnumerable<KeyValuePair<string, string>>>(); // 假设KvpValues已填充数据 Dictionary<string, string> values = KvpValues.Values .SelectMany(kvpList => kvpList) // 把所有嵌套的键值对展平成单层集合 .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
处理键重复的情况
如果嵌套结构中存在重复键,直接用上述代码会抛出ArgumentException(字典不允许重复键),可根据需求选择以下处理方式:
保留第一个出现的键值对
Dictionary<string, string> values = KvpValues.Values .SelectMany(kvpList => kvpList) .GroupBy(kvp => kvp.Key) // 按键分组 .ToDictionary(group => group.Key, group => group.First().Value); // 取每组第一个值
保留最后一个出现的键值对
Dictionary<string, string> values = KvpValues.Values .SelectMany(kvpList => kvpList) .GroupBy(kvp => kvp.Key) .ToDictionary(group => group.Key, group => group.Last().Value); // 取每组最后一个值
.NET 6+ 简化去重
如果你使用.NET 6或更高版本,可直接用DistinctBy实现去重(默认保留第一个出现的键):
Dictionary<string, string> values = KvpValues.Values .SelectMany(kvpList => kvpList) .DistinctBy(kvp => kvp.Key) // 按Key去重 .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
关键方法说明
SelectMany:将多层嵌套集合"拍平"为单层集合,这里就是遍历外层字典的每个子集合,提取所有内部键值对。ToDictionary:将展平后的键值对集合转换为目标字典,需指定键和值的选择逻辑。
内容的提问来源于stack exchange,提问作者Denys TDV
相关产品推荐
相关产品推荐

