c# - 如何按值列表分组,然后计算每个值的条目数量

我有一个对象列表。每个对象都包含一个以逗号分隔的字符串形式的类别列表。 我想知道每个类别有多少个对象。为此,我认为我需要按类别分组,然后对条目进行计数 - 但是我无法全神贯注地按列表分组。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

class MyDto
{
    public string Name { get; set; }

    public List<string> Categories => CategoriesString
        .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToList();
    public string CategoriesString { get; set; }

    public override string ToString()
    {
        return Name + ": " + CategoriesString;
    }
}

public class Program
{
    public static void Main()
    {
        var dtos = new MyDto[]
            {
                new MyDto() { Name = "Dto 1", CategoriesString = "DELIVERY"},
                new MyDto() { Name = "Dto 2", CategoriesString = "DELIVERY , DAMAGE"},
                new MyDto() { Name = "Dto 3", CategoriesString = "DAMAGE"},
                new MyDto() { Name = "Dto 4", CategoriesString = "DAMAGE , DELIVERY"},
                new MyDto() { Name = "Dto 5", CategoriesString = "DELIVERY"},
            };

        var res = dtos.GroupBy(c => c.Categories).Select(c => new { c.Key, amt = c.Count() });


        foreach (var c in res)
        {
            Console.WriteLine(c.Key + " - " + c.amt);
        }

        // Should return:
        //  DELIVERY - 4
        //  DAMAGE - 3
    }
}

https://dotnetfiddle.net/bowYb4

上面的示例只是为了演示问题,实际上并没有给出预期的结果。我正在使用来自带有 EF 核心的数据库的数据对象。我知道我尝试做的事情不会转化为 SQL - 我正在做这个客户端,这很好。

最佳答案

一种选择是使用 SelectMany 来展平类别并以键值对的形式转换 dto(我使用值元组来存储它们):

var res = dtos
    .SelectMany(dto => dto.Categories.Select(c => (Cat: c, dto.Name)))
    .GroupBy(c => c.Cat)
    .Select(c => new { c.Key, amt = c.Count() });

https://stackoverflow.com/questions/69113916/

相关文章:

python - subprocess.call() 和 os.system() 之间的速度差异

python - AES CTR解密: Cryptography and Cryptodome gi

python - 根据列表字典python的输入获取名称

amazon-web-services - 带有自定义 SAML 应用程序的 AWS SSO 'no

Go - 如何子类型化包装错误类?

visual-studio-code - 如何在 VS Code 中按字母顺序排列纯文本列表?

flutter - 如何在 flutter 中的行之间写 OR

c - 有没有办法从未知字节设置/清除位,同时保持所有其他位不变?

r - 如何根据列中的两个值过滤行?

c++ - 在 "Effective Modern C++"示例中在索引运算符之前使用 std::f