C# 如何在一个对象中使用两个元素的Group by并获取列表中的计数?

C# 如何在一个对象中使用两个元素的Group by并获取列表中的计数?,c#,linq,list,count,group-by,C#,Linq,List,Count,Group By,我有一个学生名单 public class Student { string Name; string Class; string Division; } 我还有一门课,像StudentCount public class StudentCount { string Class; string Division; string Count; } 我必须从列表(学生)中填充列表(学生计数) 用于上述结果的SQL语句 select Class,di

我有一个学生名单

public class Student
{
    string Name;
    string Class;
    string Division;
}
我还有一门课,像StudentCount

public class StudentCount
{
    string Class;
    string Division;
    string Count;
}
我必须从列表(学生)中填充列表(学生计数)

用于上述结果的SQL语句

select Class,division,count(*) 
from Student
group by Class, Division
学生数据

Name - Class - Division

Aa   -   1    -   A

Bc   -   1    -   A

Cc    -  1   -    B

Dd   -   2    -   A
我在寻找这样的结果

预期结果

Class - Division - Count

1    -    A     -    2

1 -       B       -  1

2  -      A   -      1
我在列表中有学生数据(学生)。 我必须在列表中获得结果(StudentCount)


任何人都可以通过在C#?

中帮助实现此结果。您可以使用匿名对象进行分组:

var groups = data.GroupBy(item => new { item.Class, item.Division });
                 .Select(item => new StudentCount 
                                     { 
                                         Class = item.Key.Class, 
                                         Division = item.Key.Divison,
                                         Count = item.Count()
                                     });

您可以使用匿名对象进行分组:

var groups = data.GroupBy(item => new { item.Class, item.Division });
                 .Select(item => new StudentCount 
                                     { 
                                         Class = item.Key.Class, 
                                         Division = item.Key.Divison,
                                         Count = item.Count()
                                     });

假设您将内部字段升级为公共属性,我相信下面的Linq查询满足您的要求

students
    .GroupBy(s => new{s.Class, s.Division})
    .Select(g => new StudentCount{Count = g.Count(),
                                  Class = g.Key.Class, 
                                  Divison = g.Key.Division})

假设您将内部字段升级为公共属性,我相信下面的Linq查询满足您的要求

students
    .GroupBy(s => new{s.Class, s.Division})
    .Select(g => new StudentCount{Count = g.Count(),
                                  Class = g.Key.Class, 
                                  Divison = g.Key.Division})

首先,将您的类成员设置为公共的(但不建议在类中设置公共字段)。像这样:

public class Student
{
    public string Name;
    public string Class;
    public string Division;
}
然后用这个:

 var groups = data.GroupBy(item => new { item.Class, item.Division })
                  .Select(item => new StudentCount()
                  {
                      Class = item.Key.Class,
                      Division = item.Key.Division,
                      Count = item.Count().ToString() //the Count is of type string, so don't forget to make the proper conversion
                  });

首先,将您的类成员设置为公共的(但不建议在类中设置公共字段)。像这样:

public class Student
{
    public string Name;
    public string Class;
    public string Division;
}
然后用这个:

 var groups = data.GroupBy(item => new { item.Class, item.Division })
                  .Select(item => new StudentCount()
                  {
                      Class = item.Key.Class,
                      Division = item.Key.Division,
                      Count = item.Count().ToString() //the Count is of type string, so don't forget to make the proper conversion
                  });

你自己试过什么吗?关于StackOverflow的问题预计会代表提问者表现出一定程度的努力……你自己试过什么吗?关于StackOverflow的问题预计会代表提问者显示出一定程度的努力……他还需要计数:(@Julie Shannon谢谢,修正了这个问题。他还需要计数:(@Julie Shannon谢谢,修复了这个问题。@OndrejJanacek:除了关于冗余代码的Resharper警告之外,您的编辑给表带来了什么?
Class=
Division=
是冗余的,但我并不是输入editwar来修复它。我实际上认为有必要指定您在使用时分配给的属性e对象初始值设定项…如果名称与映射属性完全匹配,则不需要。
Count
类型为string!我不想重复这种愚蠢行为。我确信OP可以拥有一个字符串(如果他们真的想要)。我不需要。@OndrejJanacek:除了关于冗余代码的重新锐化警告之外,您的编辑会给表带来什么?
Class=
Division=
是多余的,但我并没有输入editwar来修复它。我实际上认为,在使用对象初始值设定项时,有必要指定要分配给的属性……如果名称与映射属性完全匹配,则不必指定。
Count
是字符串类型!我不想重复这种愚蠢行为。我很抱歉如果他们真的想要的话,我肯定OP可以有一个字符串。我没有。