我有一个复杂的3D结构List<List<List<myClass>>>
,我希望将其简化为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
复制。
还有其他实现此目标的优雅方法吗?也许是linq?
答案 0 :(得分:2)
尝试选择许多
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;
}
答案 1 :(得分:0)
我能想到的最佳解决方案:
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;
}