Home > Software design >  How to select students with repeated low scores?
How to select students with repeated low scores?

Time:06-25

Scores are considered low if they are less than or equal to 5. I want to select students with repeated low scores.

The expected result is:

Andy 
Bobby
Cindy

As each of them has repeated low scores.

Question

I got stuck in completing the last expression GroupBy in the Where clause. Could you make it done?

class Student
{
    public int Id { get; set; }
    public string Name { get; set; } = null!;
    public List<int> Scores { get; set; } = new List<int>();

    public static List<Student> GetStudents()
    {
        return new List<Student>()
        {
            new Student
            {
                Id = 1,
                Name="Andy",
                Scores={1,1,2,2,3,4,5,6,7,8}
            },
            new Student
            {
                Id = 2,
                Name="Bobby",
                Scores={3,3,3,3,4,5}
            },
            new Student
            {
                Id = 3,
                Name="Cindy",
                Scores={1,1,2,2,3,4,5}
            },
            new Student
            {
                Id = 4,
                Name="Dave",
                Scores={1,2,3,4,5,6,7,8,9,10}
            }
        };
    }
}


class Program
{
    static void Main()
    {
        var query = Student.GetStudents()
                           .Where(s => s.Scores.GroupBy(i => i).????);
            

        foreach (var x in query)
            Console.WriteLine(x.Name);

        Console.ReadLine();
    }
}

CodePudding user response:

I'd do something like this:

var query = Student.GetStudents()
                           .Where(s => s.Scores
                                        .Where(x => x <= 5)
                                        .GroupBy(i => i)
                                        .Any(x => x.Count() > 1));

CodePudding user response:

Try following :

           var query = Student.GetStudents()
                               .Select(x => new { student = x.Name, scores = x.Scores.GroupBy(y => y).Select(y => new { score = y.Key, count = y.Count() }).ToList() }).ToList();

            var lowScore = query.Where(x => x.scores.Any(y => (y.count > 1) && (y.score <= 5))).ToList();
 

For more readable version:

var query = Student
        .GetStudents()
        .Select(x => new
        {
            student = x.Name,
            scores = x.Scores.GroupBy(y => y).Select(y => new
            {
                score = y.Key,
                count = y.Count()
            }).ToList()
        }).ToList();

var lowScore = query
        .Where(x => x
                    .scores
                    .Any(y => (y.count > 1) && (y.score <= 5)))
        .ToList();
  • Related