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

如何将嵌套Obj1对象转为以Obj3.Key为键的指定IDictionary字典

实现方案

要完成这个转换,核心是先扁平化嵌套集合,再按Obj3.Key分组,最后转成目标字典类型。具体步骤如下:

1. 扁平化数据

每个Obj2包含多个Obj3,需要将每个Obj2与它下属的每一个Obj3.Key一一配对,用SelectMany实现展开:

var flattened = o.a2.SelectMany(obj2 => 
    obj2.b2.Select(obj3 => new { Key = obj3.Key, Obj2Item = obj2 })
);

这一步会把所有Obj2和对应的Key拆分成扁平的键值对集合,避免嵌套结构导致分组逻辑失效。

2. 按Key分组并转字典

基于扁平化后的集合,用GroupBy按Key分组,再通过ToDictionary转换为目标类型:

IDictionary<string, IEnumerable<Obj2>> result = flattened
    .GroupBy(item => item.Key)
    .ToDictionary(group => group.Key, group => group.Select(item => item.Obj2Item));

完整代码示例

结合你的对象实例,完整代码如下(注意修正对象初始化器里的分号为逗号,符合C#语法要求):

// 修正后的对象实例
Obj1 o = new Obj1
{
    a1 = "a",
    a2 = new[]
    {
        new Obj2
        {
            b1 = "b",
            b2 = new[]
            {
                new Obj3 { Key = "c" },
                new Obj3 { Key = "d" } // 新增一个Key,测试多分组场景
            }
        },
        new Obj2
        {
            b1 = "e",
            b2 = new[]
            {
                new Obj3 { Key = "c" }
            }
        }
    }
};

// 转换逻辑
var result = o.a2
    .SelectMany(obj2 => obj2.b2.Select(obj3 => new { obj3.Key, obj2 }))
    .GroupBy(x => x.Key)
    .ToDictionary(g => g.Key, g => g.Select(x => x.obj2));

执行后,result中键"c"会包含两个Obj2实例,键"d"包含一个Obj2实例,完全符合需求。

为什么直接GroupBy可能失败

如果直接对o.a2使用GroupBy,只能基于Obj2自身的属性分组,但一个Obj2对应多个Obj3.Key,无法直接将单个Obj2分配到多个分组里。必须先通过SelectMany扁平化,让每个Obj2和它的每个Key形成独立条目,才能完成正确分组。

内容的提问来源于stack exchange,提问作者Anonymous-PM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:35:18