首页 > 解决方案 > 嵌套数组中的 Linq Group By

问题描述

我有一个事件对象列表(列表),方法如下:

  Incident
    -Title
    -Category
      -Name
      -Subcategory
        -Name

我正在寻找一种 Linq 有效的方式,以获取与每个类别和子类别相关的事件计数

CategoryName        
Count        
Subcategories           
   SubcategoryName          
   Count 
 var categoryGroup = incidentsModel.GroupBy(i => i.Category.Name);

        var categoryGroupAndSubcategoryGroup =  categoryGroup.Select(group =>
        {
            var subcategories = group.SelectMany(item => item.Category.Subcategories).GroupBy(item => item.Name).Select(item =>  new IncidentSubcategoriesCount
            {
                SubcategoryName = item.Key,
                SubcategoryCount = item.Count()
            });

             return new IncidentCategoriesCount
             {
                 CategoryName = group.Key,
                 catagoryCount = group.Count(),
                 Subcategories = subcategories
             };
        });


        return categoryGroupAndSubcategoryGroup;

测试@hannan 回答上面的代码返回:

[
{
    "categoryName": "Alumbrado",
    "catagoryCount": 1,
    "subcategories": [
        {
            "subcategoryName": "Lamparas",
            "subcategoryCount": 1
        }
    ]
},
{
    "categoryName": "Seguridad",
    "catagoryCount": 3,
    "subcategories": [
        {
            "subcategoryName": "Narcotráfico",
            "subcategoryCount": 3
        },
        {
            "subcategoryName": "Robo",
            "subcategoryCount": 3
        }
    ]
}

]

CategoryName 和 CategoryCount 都可以,错误在 SubcategoriesCount 中,“Narcotrafico”SubcategoryCount 必须为 2,“Robo”SubcategoryCount 必须为 1,因此 Total 为 3。

预期结果

   [
{
    "categoryName": "Alumbrado",
    "catagoryCount": 1,
    "subcategories": [
        {
            "subcategoryName": "Lamparas",
            "subcategoryCount": 1
        }
    ]
},
{
    "categoryName": "Seguridad",
    "catagoryCount": 3,
    "subcategories": [
        {
            "subcategoryName": "Narcotráfico",
            "subcategoryCount": 2
        },
        {
            "subcategoryName": "Robo",
            "subcategoryCount": 1
        }
    ]
}

]

标签: c#.netlinq

解决方案


使用 Select Many 然后你可以按照你想要的任何方式进行分组

    class Program
    {
        static void Main(string[] args)
        {
            List<Incident> indcidents = new List<Incident>();

            var results = indcidents.SelectMany(x => x.catogories
                .SelectMany(y => y.subcategories.Select(z =>
                    new { title = x.Title, CategoryName = y.Name, Subcategory = z.Name }
            ))).ToList();
        }
    }
    public class Incident
    {
        public string Title { get; set; }
        public List<Category> catogories { get; set; }
    }
    public class Category
    {
        public string Name { get; set; }
        public List<Subcategory> subcategories { get; set; }
    }
    public class Subcategory
    {
        public string Name { get; set; }

    }

推荐阅读