根据键将 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&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 重复。

请注意,我查看了以下问题: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>>的主要内容,如果未能解决你的问题,请参考以下文章

C# list<>根据对象的某个属性排序

list 根据某个字段分组

我们如何根据 value 中的两个字段对字典<List<int>、List<int>> 进行排序

list分组------根据某一个字段分组

list分组------根据某一个字段分组

List<Object>排序