根据键将 List<List<List<T>>> 转换为 List<List<T>>
Posted
技术标签:
【中文标题】根据键将 List<List<List<T>>> 转换为 List<List<T>>【英文标题】:Convert List<List<List<T>>> into List<List<T>> based on key 【发布时间】:2019-05-20 16:58:57 【问题描述】:我有一个 List<List<List<myClass>>>
的复杂 3D 结构,我希望它减少到 List<List<myClass>>
。
public class MyClass
public string Key get; set;
public decimal Price get; set;
问题在于 MyClass
在原始 3D 列表中被复制,具有相同的键,例如:
(我在编写 3D 和 2D 多维数组时遇到了麻烦,所以我只是硬编码了一个示例。)
List<List<List<MyClass>>> level1 = new List<List<List<MyClass>>>();
List<List<MyClass>> level2_1 = new List<List<MyClass>>();
List<MyClass> level3_1 = new List<MyClass>()
new MyClass() Key = "key1", Price = 10
new MyClass() Key = "key2", Price = 20
;
level2_1.Add(level3_1);
List<List<MyClass>> level2_2 = new List<List<MyClass>>();
List<MyClass> level3_2 = new List<MyClass>()
new MyClass() Key = "key2", Price = 10
new MyClass() Key = "key3", Price = 20
;
level2_2.Add(level3_2);
我需要转换后的列表会是这样的:
List<List<MyClass>> level1 = new List<List<MyClass>>();
List<MyClass> level2_1 = new List<MyClass>()
new MyClass() Key = "key1", Price = 10
List<MyClass> level2_2 = new List<MyClass>()
new MyClass() Key = "key2", Price = 10 ,
new MyClass() Key = "key2", Price = 20
List<MyClass> level2_3 = new List<MyClass>()
new MyClass() Key = "key3", Price = 20
level1.Add(level2_1);
level1.Add(level2_2);
level1.Add(level2_3);
因此主列表由Key
区分,子列表由其Price
s 重复。
请注意,我查看了以下问题:1、2、3、
还有其他优雅的方式来实现这一点吗?也许是 linq?
【问题讨论】:
【参考方案1】:尝试多选
public static List<List<MyClass>> MyConvertLinq(List<List<List<MyClass>>> items)
var allItems = items.SelectMany(m => m).ToList();
return allItems;
--- 编辑 ---
您可以使用 GroupBy 来构建群组
public static List<List<MyClass>> MyConvertLinq(List<List<List<MyClass>>> items)
var allItems = items.SelectMany(m => m).ToList().SelectMany(m => m).ToList();
var sortedItems = allItems.GroupBy(m => m.Key, m => m,
(k, classes) => classes.ToList()).ToList();
return sortedItems;
【讨论】:
但我需要将主列表与Key
区分开来
好的,您的样本也没有指定元素,因此忽略了这一点,我添加了一个 group by 以获得结果,其中 2D 中的每个列表仅包含具有相同键的元素。【参考方案2】:
我能想到的最佳解决方案:
public List<List<MyClass>> MyConvert(List<List<List<MyClass>>> items)
Dictionary<string, List<MyClass>> resultsDic = new Dictionary<string, List<MyClass>>();
foreach (List<List<MyClass>> item in items)
foreach (List<MyClass> innerItem in item)
foreach (MyClass myClass in innerItem)
if (!resultsDic.ContainsKey(myClass.Key))
resultsDic.Add(myClass.Key, innerItem);
List<List<MyClass>> convertedResults = resultsDic.Select(x => x.Value).ToList();
return convertedResults;
【讨论】:
以上是关于根据键将 List<List<List<T>>> 转换为 List<List<T>>的主要内容,如果未能解决你的问题,请参考以下文章