根据键将List <list <list <t >>>转换为List <list <t >>

时间:2018-12-20 07:27:42

标签: c# list multidimensional-array

我有一个复杂的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复制。

请注意,我浏览了以下问题:123

还有其他实现此目标的优雅方法吗?也许是linq?

2 个答案:

答案 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;
}