Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用LINQ c#中的枚举进行分组并找到最大值_C#_.net_Linq_Lambda - Fatal编程技术网

如何使用LINQ c#中的枚举进行分组并找到最大值

如何使用LINQ c#中的枚举进行分组并找到最大值,c#,.net,linq,lambda,C#,.net,Linq,Lambda,我有一份学生名单。我应该如何显示使用LINQ从各个系获得高分的学生。 我试过了,但没有成功。请建议。假设您有以下学生名单: public enum Department{ Accounts, Technology, Architecture, MBA }; public class Student { public string FirstName { get; set; } public string LastName { get; set; } public int

我有一份学生名单。我应该如何显示使用LINQ从各个系获得高分的学生。
我试过了,但没有成功。请建议。

假设您有以下学生名单:

public enum Department{ Accounts, Technology, Architecture, MBA };
public class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int ID { get; set; }
    public int ExamScores;
    public Department dep;
}
List学生=新列表{
新生(“x”、“y”、1、10、系账户),
新生(“p”,“q”,2,20,系帐),
新生(“p2”,“q2”,2,20,系账户),
新学生(“a”,“b”,3,30,技术系),
新生(“m”,“n”,4,40,技术系),
新生(“m2”、“n2”、4、40,技术系),
};
现在,您可以按部门分组,通过以下方法找到得分最高的学生:

List<Student> students = new List<Student> {
                new Student("x", "y", 1, 10, Department.Accounts),
                new Student("p", "q", 2,20, Department.Accounts),
                new Student("p2", "q2", 2, 20, Department.Accounts),
                new Student("a", "b", 3, 30, Department.Technology),
                new Student("m", "n", 4, 40, Department.Technology),
                new Student("m2", "n2", 4, 40, Department.Technology),
            };
var groupsByDept=students.GroupBy(a=>(a.dep.ToString());
列出studentsbyhighestmarkanddeptlist=groupsByDept.SelectMany(a=>a.Where(b=>b.examcores==a.Max(c=>c.examcores)).ToList();
这将产生以下结果:

如评论所述,始终包含您尝试过的内容是一个好主意。这两个原因都是因为它表明你已经做出了努力,而且有可能有人帮助你指出你的错误,你会从中学到更多

也就是说,您可以通过分两步分组来解决此问题:

  • 分组依据
    dep
  • 然后通过
    examcores
  • 最后,对结果进行排序,得到得分最高的结果:

    var groupsByDept = students.GroupBy(a => (a.dep.ToString()));
    List<Student> studentsByHighestMarksAndDeptList = groupsByDept.SelectMany(a => a.Where(b => b.ExamScores == a.Max(c => c.ExamScores))).ToList();
    
    有关示例,请参见

    // "one"-liner:
    var results = students.GroupBy(s => s.dep)
        .Select(depGroup => depGroup.GroupBy(s => s.ExamScores)
            .OrderByDescending(scoreGroup => scoreGroup.Key) // Key is the ExamScores
            .First()); // First = Get the first group, which has the highest score
    

    您可以按部门对学生进行分组,然后找到每组中分数与该部门最高分数匹配的所有学生:

    // Example output:
    // ID  dep           ExamScores
    // 3   Accounts      9
    // 7   Accounts      9
    // 4   Technology    8
    // 6   Architecture  6
    

    请告诉我们你的尝试。此外,它还将有助于查看输入和期望的输出。最后-是EF查询(或其他ORM)还是“普通”LINQ到您感兴趣的对象.students.GroupBy(s=>s.dep).Select(g=>(g.Key,g.Select(v=>v.examcores.Max());
    var departmentStudents = students.GroupBy(s => s.dep);
    
    foreach (var department in departmentStudents)
    {
        var highScore = department.Max(ds => ds.ExamScores);
    
        var bestStudents = department
            .Where(student => student.ExamScores == highScore)
            .Select(student => $"{student.FirstName} {student.LastName}");
    
        Console.WriteLine($"Sudents with best score in the {department.Key} Dept.:");
        Console.WriteLine($" - {string.Join("\r\n - ", bestStudents)}");
    }