按平均考试成绩降序分组?

问题描述

我需要 LINQ 方面的帮助,我需要根据计算的平均值对学生列表进行分组 有一个学生班:

public class Student
{
    public string Name { get; set; }  // student name
    public int[] scores { get; set; } // test scores
}

我有一份包含数据的学生名单

List<Student> students = new List<Student>
{
    new Student { Name = "Michael",scores = new int[] { 94,92,91,91 } },new Student { Name = "Isabelle",scores = new int[] { 66,87,65,93,86} },new Student { Name = "Chastity",scores = new int[] { 76,61,73,66,54} },new Student { Name = "Chaim",55,82,62,52} },new Student { Name = "Patience",scores = new int[] { 91,79,58,63,55} },new Student { Name = "Echo",scores = new int[] { 74,85,75,new Student { Name = "Pamela",scores = new int[] { 73,64,53,72,68} },new Student { Name = "Anne",scores = new int[] { 78,96,52,60} },new Student { Name = "Fuller",scores = new int[] { 59,68,88,76} },new Student { Name = "Cameron",scores = new int[] { 70,51,98} },new Student { Name = "aurora",scores = new int[] { 65,70,80,new Student { Name = "Anthony",scores = new int[] { 68,69,94,}

我需要范围的括号在测试分数括号中是 10 的倍数 • 50、60、70、80、90、100

输出应如下所示:

enter image description here

解决方法

我想是这样的吗?

结果:

--------------------------
90
Name: Michael
--------------------------

--------------------------
80
Name: Isabelle
Name: Echo
Name: Fuller
Name: Anthony
--------------------------

--------------------------
70
Name: Chastity
Name: Chaim
Name: Patience
Name: Pamela
Name: Anne
Name: Cameron
--------------------------

--------------------------
60
Name: Aurora
--------------------------

代码:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    internal static class Program
    {
        private static void Main()
        {
            var students = new List<Student>
            {
                new() {Name = "Michael",Scores = new[] {94,92,91,91}},new() {Name = "Isabelle",Scores = new[] {66,87,65,93,86}},new() {Name = "Chastity",Scores = new[] {76,61,73,66,54}},new() {Name = "Chaim",55,82,62,52}},new() {Name = "Patience",Scores = new[] {91,79,58,63,55}},new() {Name = "Echo",Scores = new[] {74,85,75,new() {Name = "Pamela",Scores = new[] {73,64,53,72,68}},new() {Name = "Anne",Scores = new[] {78,96,52,60}},new() {Name = "Fuller",Scores = new[] {59,68,88,76}},new() {Name = "Cameron",Scores = new[] {70,51,98}},new() {Name = "Aurora",Scores = new[] {65,70,80,new() {Name = "Anthony",Scores = new[] {68,69,94,98}}
            };

            var groups = students.GroupBy(s => Math.Round(s.Scores.Average() / 10) * 10).OrderByDescending(s => s.Key);

            foreach (var grouping in groups)
            {
                Console.WriteLine("--------------------------");

                Console.WriteLine(grouping.Key);

                foreach (var student in grouping)
                {
                    Console.WriteLine(student);
                }

                Console.WriteLine("--------------------------");
                Console.WriteLine();
            }
        }
    }

    public class Student
    {
        public string Name { get; set; }

        public int[] Scores { get; set; }

        public override string ToString()
        {
            return $"{nameof(Name)}: {Name}";
        }
    }
}