【问题标题】:Convert List<List<List<T>>> into List<List<T>> based on key根据键将 List<List<List<T>>> 转换为 List<List<T>>
【发布时间】:2019-05-20 16:58:57
【问题描述】:

我有一个 List&lt;List&lt;List&lt;myClass&gt;&gt;&gt; 的复杂 3D 结构,我希望它减少到 List&lt;List&lt;myClass&gt;&gt;

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 区分,子列表由其Prices 重复。

请注意,我查看了以下问题:123

还有其他优雅的方式来实现这一点吗?也许是 linq?

【问题讨论】:

    标签: c# list multidimensional-array


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 2012-02-14
      • 1970-01-01
      相关资源
      最近更新 更多