C#查询中的LINQ查询和选择组

C#查询中的LINQ查询和选择组,c#,.net,linq,C#,.net,Linq,我有以下两种方法 /// <summary> /// Reports the number of students in each ClassLevel designation /// </summary> /// <param name="students">The original collection of students</param> /// <returns>A Dictionary where the key is th

我有以下两种方法

/// <summary>
/// Reports the number of students in each ClassLevel designation
/// </summary>
/// <param name="students">The original collection of students</param>
/// <returns>A Dictionary where the key is the ClassLevel and the value is the number of students in that level</returns>
public static Dictionary<ClassLevel, int> StudentsPerClassLevel(this IEnumerable<Student> students)
{
     var query = students.GroupBy(student => student.Level).ToDictionary(x => x.Key, x => x.Count());
     return query;
}

/// <summary>
/// Determines which MaritalStatus has the highest average GPA
/// </summary>
/// <param name="students">The original collection of students</param>
/// <returns>The MaritalStatus value with the highest average GPA</returns>
public static MaritalStatus MaritalStatusWithHighestAverageGPA(this IEnumerable<Student> students)
{
        var query = students.GroupBy(s => s.Relationship).ToDictionary(x => x.Key, x => x.Average(g => g.GPA)).OrderByDescending(d => d.Value).First().Key;

        return query;
}
//
///报告每个班级指定的学生人数
/// 
///学生的原始收藏
///一种字典,其中键是类级别,值是该级别的学生人数
公共静态词典StudentsPerClassLevel(此IEnumerable students)
{
var query=students.GroupBy(student=>student.Level).ToDictionary(x=>x.Key,x=>x.Count());
返回查询;
}
/// 
///确定哪个MaritalStatus的平均GPA最高
/// 
///学生的原始收藏
///平均GPA最高的MaritalStatus值
公共静态MaritalStatus MaritalStatus具有最高平均GPA(这是无数学生)
{
var query=students.GroupBy(s=>s.Relationship).ToDictionary(x=>x.Key,x=>x.Average(g=>g.GPA)).OrderByDescending(d=>d.Value).First().Key;
返回查询;
}
这些方法都不管用,我正试图找出我哪里出了问题,我需要做些什么才能达到我想要达到的目标


有什么建议吗?

第一种方法应使用以下方法:

比如:

return students.GroupBy(student => student.Level, (level, students) => new Tuple(level, students.Count())); 
很抱歉,我无法测试这个,但基本上就像你的版本一样,我使用lambda来表示将所有学生按级别分组。第二个lambda告诉方法如何处理这些组。在本例中,我将为每个组创建一个元组,其中包含每个组中的级别和学生数

您的返回值应该更改为
IEnumerable
,如果您愿意,可以轻松地将其转换为字典

我猜不出在没有编译器的情况下解决第二个方法的语法。但这个问题使用Max:

编辑 这个版本至少可以编译。希望你能达成类似的结果

    public static Dictionary<ClassLevel, int> StudentsPerClassLevel(this IEnumerable<Student> students)
    {
        return students.GroupBy(student => student.ClassLevel, 
            (level, s) => new Tuple<ClassLevel, int>(level, s.Count())).ToDictionary(t => t.Item1, t => t.Item2);

    }
公共静态词典StudentsPerClassLevel(此IEnumerable students)
{
返回student.GroupBy(student=>student.ClassLevel,
(level,s)=>newtuple(level,s.Count()).ToDictionary(t=>t.Item1,t=>t.Item2);
}

它们以什么方式不起作用?您想要实现什么?第一种方法需要一个
GroupBy
,第二种方法需要一个Max函数。我需要再多看一看这些方法,才能给你更多的帮助。@Jeroenvanevel我一开始也有同样的评论,但是如果你看XML文档,你会发现需要什么。“这些方法都不管用”。我不相信。这意味着:他们什么也不做。你可能是说它们没有按预期工作,但是你应该详细说明预期和实际结果。格特,我说它们没有工作,因为它们不会编译。所需的返回值不是方法签名期望返回的值。第一个有效,第二个无效。你的答案很接近,ClassLevel是一个枚举,所以我必须在某个地方与ClassLevel的枚举进行比较。大二,ClassLevel。大三,ClassLevel。大一,或ClassLevel。大四。它还表示“无法将lambda表达式转换为Collections.Generic.IQqualityComparer类型,因为它不是委托typevar query=students.GroupBy(student=>student.Level,(ClassLevel)=>new Tuple(ClassLevel,students.Count());每当我将任何内容放在ClassLevel之后时,它都会抛出一个错误,如您的示例(Level,students)它需要一个比较器,我想这会让人担心。我现在可以访问Visual Studio来更详细地解决这个问题。很惊讶没有其他人回答这个问题。我已经解决了!谢谢,我会更新我的答案