#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},...]