c# - 如何在linq中进行不同的分组

标签 c# linq

我有一些东西在普通的 simpel 循环中工作,但我想知道如何使用 LINQ 来完成它,如果可能的话。

我什至不知道如何描述我想做的事情。但是堆栈溢出希望我用文字而不是示例来做到这一点,所以这是我在欺骗它...

(精简)

public class Product
{

    public int ProductId { get; set; }
    public string Name { get; set; }
    public List<CategoryGroup> CategoryGroups { get; set; }
}

public class CategoryGroup
{
    public int CategoryGroupId { get; set; }
    public string Name { get; set; }
    public List<Category> Categories { get; set; }
}

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
}

我想做什么

来自

Product 1
    CategoryGroup 1
        Category 11
        Category 12
        Category 13
    CategoryGroup 2
        Category 21
        Category 22

Product 2
    Category Group 1
        Category 11
        Category 14
    Category Group 2
        Category 21
    Category Group 3
        Category 31

Category Group 1
    Category 11
    Category 12
    Category 13
    Category 14
Category Group 2
    Category 21
    Category 22
Category Group 3
    Category 31

工作代码

var categoryGroups = new List<CategoryGroup>();
foreach (var product in products)
{
    foreach (var categoryGroup in product.CategoryGroups)
    {
        var group = categoryGroups.SingleOrDefault(cg => cg.CategoryGroupId == categoryGroup.CategoryGroupId);
        if (group == null)
        {
            group = new CategoryGroup {
                Categories = new List<Category>(),
                CategoryGroupId = categoryGroup.CategoryGroupId,
                Name = categoryGroup.Name
            };
            categoryGroups.Add(group);
        }

        foreach (var category in categoryGroup.Categories)
        {
            if (group.Categories.Any(c => c.CategoryId == category.CategoryId))
            {
                continue;
            }
            group.Categories.Add(category);
        }
    }
}

最佳答案

你可以通过 SelectMany 做很多子选择:

var result = products
            .SelectMany(x => x.CategoryGroups)
            .GroupBy(x => x.CategoryGroupId)
            .Select(x => new CategoryGroup
                         {
                             Categories = x.SelectMany(y => y.Categories)
                                           .Distinct(y => y.CategoryId)
                                           .OrderBy(y => y.CategoryId)
                                           .ToList(),
                             CategoryGroupId = x.Key,
                             Name = x.Values.First().Name
                         })
            .OrderBy(x => x.CategoryGroupId)
            .ToList();

关于c# - 如何在linq中进行不同的分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44718546/

相关文章:

c# - 使用 ServiceStack.Text 序列化 ExpandoObject

c# - 如何检查类型是否是可移植库中的结构

c# - 根据 LINQ 中一个值的最小值或最大值进行选择

C# Linq System.Linq 和 System.Collections 之间的模糊调用

c# - 使用 Entity Framework 6 调用数据库函数

c# - 如何在将加载到 Redis 的 LUA 脚本上重用代码?

c# - OAuth 与 DotNetOpenAuth?

c# - 关闭和打开设计器文件时标签大小、面板大小发生变化

c# - ODAC/Oracle 等同于 Linq to Entities GroupBy FirstOrDefault

c# - ToList() 上的 "Sequence contains no matching element"