C# 如何对逗号分隔字符串中项目的出现次数进行分组和计数

C# 如何对逗号分隔字符串中项目的出现次数进行分组和计数,c#,linq,C#,Linq,我有一个具有以下属性的学生类 public class Student { public string Name{ get; set; } public string Subject { get; set; } } 假设我们有一个学生列表,如下所示 var students = new List<Student>(); students.Add(new Student { Name = "John", Subject = "Math"}); students.Add

我有一个具有以下属性的学生类

public class Student
{
    public string Name{ get; set; }
    public string Subject { get; set; }
}
假设我们有一个学生列表,如下所示

var students = new List<Student>();
students.Add(new Student { Name = "John", Subject = "Math"});
students.Add(new Student { Name = "Bob", Subject = "English, Math"});
students.Add(new Student { Name = "Jane", Subject = "Math, History, Art"});
students.Add(new Student { Name = "Jim", Subject = "English"});

我如何使用linq获得结果?

基本上,您要做的是首先获取所有学生的主题,然后收集这些主题。要做到这一点,您需要用逗号分割
主题
,然后修剪结果(去掉逗号周围的空格)。这将为您提供所有主题的列表

students.SelectMany(arg => arg.Subject.Split(new []{','})) // split the Subject-property on commas
        .Select(arg => arg.Trim()) // get rid of the whitespaces after commas
        .GroupBy(arg => arg) // you can inject an equality comparer here, to achieve case insenstive grouping
        .Select(arg => new
                       {
                         Subject = arg.Key,
                         Count = arg.Count()
                       }); // TODO output these objects to your console..
现在,您需要做的就是计算每个主题在列表中出现的频率。要做到这一点,只需使用
GroupBy
。之后,您将所有受试者按名称分组,因此您只需计算每个组中有多少受试者

然后,您可以收集该结果,例如在字典中,如下所示:

IDictionary<string, int> subjectCount = students
    .SelectMany(s => s.Subject.Split(','))
    .Select(s => s.Trim())
    .GroupBy(s => s)
    .ToDictionary(grp => grp.Key, grp => grp.Count());

foreach (var count in subjectCount)
{
    Console.WriteLine("{0}: {1}", count.Key, count.Value);
}

谢谢,它很有魅力,谢谢你的建议。@user3851289请将答案标记为已接受。“谢谢”的评论是善意的,但并不被视为必要的内容。
IDictionary<string, int> subjectCount = students
    .SelectMany(s => s.Subject.Split(','))
    .Select(s => s.Trim())
    .GroupBy(s => s)
    .ToDictionary(grp => grp.Key, grp => grp.Count());

foreach (var count in subjectCount)
{
    Console.WriteLine("{0}: {1}", count.Key, count.Value);
}
public class Student
{
    public string Name { get; set; }
    public List<string> Subjects { get; set; }
}