代码之家  ›  专栏  ›  技术社区  ›  Shahar Shokrani

根据键将List<List<T>>转换为List<List<T>>

  •  0
  • Shahar Shokrani  · 技术社区  · 7 年前

    我有一个复杂的3D结构 List<List<List<myClass>>> 我想把它减少到 List<List<myClass>> .

    public class MyClass
    {
        public string Key { get; set; }
        public decimal Price { get; set; }
    }
    

    问题是 MyClass 已使用相同的键在原始三维列表中复制,如:

    (我在编写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

    1 , 2 , 3 ,

    2 回复  |  直到 7 年前
        1
  •  2
  •   Daniel W.    7 年前

    尝试选择多个

        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;
        }
    
        2
  •  0
  •   Shahar Shokrani    7 年前

    我能想到的最佳解决方案是:

    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;
    }
    
    推荐文章