输出到具有最佳 GPA 的控制台组(使用 LINQ,无循环)

Posted

技术标签:

【中文标题】输出到具有最佳 GPA 的控制台组(使用 LINQ,无循环)【英文标题】:Output to console group with the best GPA (using LINQ, without loops) 【发布时间】:2022-01-13 15:06:09 【问题描述】:

我需要将组名和每个科目的平均分数输出到控制台。 但在 Console.WriteLine GroupgroupAverageMath 下划线错误“当前上下文中不存在名称“Group”/“groupAverageMath” "

static void BestGroupAverage()

    List<Student> students = ListManager.LoadSampleData();

    var GroupAverageMath =
        from student in students
        group student by student.Group into studentGroup
        select new
        
            Group = studentGroup.Key,
            groupAverageMath = studentGroup.Average(x => x.Math),
        ;

    Console.WriteLine("\nGgroup with the best GPA in Math: " + Group + groupAverageMath);
    Console.ReadLine();

【问题讨论】:

该查询的结果将是一个IEnumerable&lt;T&gt;(在变量GroupAverageMath 中),其中T 是一个具有两个属性的匿名类型对象:GroupgroupAverageMath。它不会有任何排序。从该集合中,您需要选择具有最高 groupAverageMath 的集合。如果您查看 GroupAverageMath 变量,您应该在调试器中看到这一点 您需要在变量名中使用正确的大写/小写字母。 放大/完善@jdweng 的评论:您实际上并不需要 使用正确的 命名来使其工作。但是,你真的应该有一些命名约定。有两种标准的 .NET/C# 命名约定(一种在成员字段前加下划线,另一种则没有)。具有一致的命名使阅读和维护代码变得如此简单。您有一个以大写字母 (GroupAverageMath) 开头的局部变量和一个以小写字母 (groupAverageMath) 开头的属性(基本上同名),这很难阅读 【参考方案1】:

这是一个非常明确的解决方案。您没有提供 Student 类的定义,所以我必须:

public class Student

    public string Name  get; set; 
    public string Group  get; set; 
    public decimal Math  get; set; 
    public Student (string name, string group, decimal mathGrade)
    
        Name = name;
        Group = group;
        Math = mathGrade;
    

然后,通过非常明确的步骤,您可以理解。请注意,我提供了数据(因为,同样,您没有提供):

public static void Test()

    //this is what you need to do in a question, provide
    //enough data so others can reproduce your issue
    var students = new List<Student>
    
        new Student("A", "blue", 42),
        new Student("B", "blue", 88.5m),
        new Student("C", "green", 99m),
        new Student("D", "blue", 78.5m),
        new Student("E", "red", 66.6m),
        new Student("X", "red", 90),
        new Student("Y", "green", 28),
        new Student("Z", "blue", 80),
    ;

    var groupAverageMath =
        from student in students
        group student by student.Group into studentGroup
        select new
        
            Group = studentGroup.Key,
            GroupAverageMath = studentGroup.Average(x => x.Math),
        ;
    var bestMathGrade = groupAverageMath.Max(gr => gr.GroupAverageMath);
    var bestGroups = groupAverageMath.Where(g => g.GroupAverageMath ==bestMathGrade);
    var bestGroup = bestGroups.FirstOrDefault();
    Console.WriteLine($"\nGroup with the best GPA in Math: bestGroup.Group score: bestGroup.GroupAverageMath");
    Console.ReadLine();

我得到了小组。然后我得到最大的组平均值。然后我找出哪个或哪些组得到了这个平均值。然后我选择第一个。

这会导致:

Group with the best GPA in Math: red score: 78.3

【讨论】:

以及如何实现一个学生列表,以便它可以用于代码中的不同任务——其中每个任务都被框架为一个单独的类方法? (例如:确定GPA最高的学生/学生;计算每个科目的平均分;对于每个科目,确定平均分最高的组) 您的代码显示(字面意思):Ggroup with the best GPA in Math。我向你展示了如何做到这一点。您的代码调用ListManager.LoadSampleData()。我以为你有那个代码。你的问题纯粹是关于数学中最好的小组。这个问题得到了回答。您不能更改规格并抱怨先前交付的解决方案不符合新规格。我给出的答案是故意非常解释性的。那里应该有足够的内容让您弄清楚您的新问题 你的答案正确。只是想在其他情况下获得更多细节。但我已经想通了。所以,谢谢你的帮助

以上是关于输出到具有最佳 GPA 的控制台组(使用 LINQ,无循环)的主要内容,如果未能解决你的问题,请参考以下文章

Linq:获取具有多个嵌套组的内部对象的小计

在linq中使用GroupBy时,如何获取组名列表?

我想我有范围问题?

无法显示从控制器到视图的LINQ查询输出值

什么是具有这些要求的最佳 ORM [关闭]

LINQ - 选择每组具有最大属性值的记录