Как получить максимальную версию записи из каждого набора с помощью LINQ?

#c# #linq

#c# #linq

Вопрос:

У меня есть следующий список студентов:

 IList<Student> studentList = new List<Student>()
{ 
    new Student() { StudentID = 1, StudentName = "John", Age = 13 ,Version = 1, Group = 1},
    new Student() { StudentID = 2, StudentName = "Moin", Age = 21 ,Version = 2, Group = 1},
    new Student() { StudentID = 3, StudentName = "Bill", Age = 18, Version = 1, Group = 2},
    new Student() { StudentID = 4, StudentName = "Ram", Age = 20, Version = 1, Group = 3},
    new Student() { StudentID = 5, StudentName = "Ron", Age = 15, Version = 1, Group = 5},
    new Student() { StudentID = 6, StudentName = "yim", Age = 25, Version = 2, Group = 5},
};
  

Как мне получить список, содержащий максимальную версию каждой группы? Какой подходящий запрос LINQ?

Вывод должен выглядеть так:

 { StudentID = 2, StudentName = "Moin", Age = 21, Version = 2, Group = 1 },
{ StudentID = 3, StudentName = "Bill", Age = 18, Version = 1, Group = 2 },
{ StudentID = 4, StudentName = "Ram", Age = 20, Version = 1, Group = 3 },
{ StudentID = 6, StudentName = "yim", Age = 25, Version = 2, Group = 5 },
  

Ответ №1:

Как насчет

 var results = studentList.GroupBy(x => x.Group)
                         .Select(x => x.OrderByDescending(xx => xx.Version).First())
                         .ToList();
  

Сгруппируйте их Group , затем упорядочите группировки по Version убыванию и выберите первую из группировки.

Комментарии:

1. Поддержано. Однако, если в каждой группе много элементов, повторная сортировка будет дорогостоящей. Может быть предоставлена функция, которая выдает учащемуся максимальную версию в O (n)

2. Не могли бы вы OrderBy(x => x.Group).ThenByDescending(x => x.Version) затем выполнить GroupBy select. Редактировать: тогда ответ studentList.OrderBy(x => x.Group).ThenByDescending(x => x.Version).GroupBy(x => x.Group).Select(x => x.First())

3. Это, конечно, не работает в EF Core, поэтому удалите тег.

Ответ №2:

  var maxStudents = (from s in studentList
                    group s by s.Version into g
                    select new 
                    {
                      Version = g.Key,
                      MaxAge = g.Max(s => s.Age)
                    }).ToList();
// You'll be left with an array like: [{Version=1, MaxAge=21},...]