使用 GroupBy 从 List 中创建子列表,其中 GroupBy 值为 List<t>

Posted

技术标签:

【中文标题】使用 GroupBy 从 List 中创建子列表,其中 GroupBy 值为 List<t>【英文标题】:Use GroupBy to make SubLists from List where the GroupBy value is a List<t> 【发布时间】:2021-11-01 07:26:43 【问题描述】:

我有一个想要显示的简单列表,按它所属的类别分组。我见过的所有示例都使用 GroupBy 但只有一个 ID,我无法弄清楚如何使用 List 来执行此操作。如果产品出现在两个类别下就可以了。

public class Product

    public int Id  get; set; 
    public string Title  get; set; 
    public List<Category> Categories  get; set; 


StringBuilder ProductList = new StringBuilder();
var p = _products.GroupBy(a => a.Categories);

foreach (var item in p)

    ProductList.Append($"<p><strong>item.Key</strong><br/>");
    foreach (var e in item)
    
        ProductList.Append($"e.Title");
        ProductList.Append("</p>");
    

【问题讨论】:

您想显示每个类别或一组特定类别的值? 【参考方案1】:

这是一个包含示例数据的解决方案,您可以自己测试:

        var categories = Enumerable.Range(0, 10).Select(n => new Category  Id = n ).ToArray();
        var products = new[]
        
            new Product  Id = 1, Title = "P1", Categories = new List<Category>  categories[0], categories[1], categories[2]  ,
            new Product  Id = 2, Title = "P2", Categories = new List<Category>  categories[0], categories[1], categories[3]  ,
            new Product  Id = 3, Title = "P3", Categories = new List<Category>  categories[0], categories[2], categories[3]  ,
            new Product  Id = 4, Title = "P4", Categories = new List<Category>  categories[0], categories[2], categories[3]  ,
            new Product  Id = 5, Title = "P5", Categories = new List<Category>  categories[0], categories[3], categories[5]  ,
            new Product  Id = 6, Title = "P6", Categories = new List<Category>  categories[0], categories[4], categories[5]  ,
        ;

        var categoryGroups =
            from p in products
            from c in p.Categories
            group p by c.Id into g
            select g;

        foreach (var categoryGroup in categoryGroups)
        
            Console.WriteLine($"Category categoryGroup.Key:");
            
            foreach (var product in categoryGroup)
            
                Console.WriteLine($"\tProduct product.Id: product.Title");
            

            Console.WriteLine("-----------------------------------------------------");
        

我假设 Category 类有一些 id 属性,例如Id,分组。如果是基于引用的分组,您可以将 group p by c.Id into g 替换为 group p by c into g

【讨论】:

【参考方案2】:

您可以使用SelectMany 将列表扁平化为(Product, Category) 的元组,然后使用GroupBy 按类别对产品进行分组。

StringBuilder ProductList = new StringBuilder();
var p = _products
    .SelectMany(a => a.Categories, (prod, cat) => (prod, cat))
    .GroupBy(tuple => tuple.cat, tuple => tuple.prod);

foreach (var item in p)

    ProductList.Append($"<p><strong>item.Key</strong><br/>");
    foreach (var e in item)
    
        ProductList.Append(e.Title);
        ProductList.Append("</p>");
    

【讨论】:

以上是关于使用 GroupBy 从 List 中创建子列表,其中 GroupBy 值为 List<t>的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 groupby 在 Pandas 数据框中创建每行是运行列表的列吗?

从 Python groupby 填充日期

在 groupby 之后在 pandas DataFrame 的列表变量中创建一个列表

PushCreate 在 Kendo HierarchicalDataSource 中创建子节点

如何在 vuetify 主抽屉/导航中创建子菜单

在视图 SQL-ORACLE 中创建子查询