You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:50:42