C# 使用Linq实现嵌套字典内外层键互相交换方案咨询
调整后的Linq写法
你要的反转嵌套字典的逻辑只需要先把嵌套结构拍平,再按内层键分组即可,最终代码如下:
// 最终结果类型:Dictionary<string, Dictionary<string, IEnumerable<V1Container>>> var reversed = nodeTypedContainer // 第一步:将嵌套结构拆分为 (内层键, 外层节点键, 对应值集合) 的三元组 .SelectMany(nodeEntry => nodeEntry.Value.Select(innerEntry => new { InnerKey = innerEntry.Key, NodeKey = nodeEntry.Key, Value = innerEntry.Value })) // 第二步:按内层键分组,分组Key就是目标结构的外层键 .GroupBy(triple => triple.InnerKey) // 第三步:转换为最终的嵌套字典结构 .ToDictionary( outerGroup => outerGroup.Key, outerGroup => outerGroup.ToDictionary( innerEntry => innerEntry.NodeKey, innerEntry => innerEntry.Value ) );
逻辑说明
- 你原有写法的核心问题是错误地将同一个外层节点下的所有内层键打包为集合作为分组依据,所以得到的外层键是
IEnumerable<string>类型,不符合需求。 - 上述写法先通过
SelectMany把每个内层键都拆成独立的三元组,再单独以内层键为维度分组,刚好匹配你要的结构:- 外层字典的键是原内层字典的键(示例中的k1、k2)
- 内层字典的键是原外层字典的节点名(示例中的node1、node2)
- 对应的值保持原有的
IEnumerable<V1Container>集合不变
内容的提问来源于stack exchange,提问作者user17563595
相关产品推荐
相关产品推荐

