如何将嵌套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
相关产品推荐
相关产品推荐

