Удаление строки самого младшего студента в каждой группе элемента управления ListView - PullRequest
0 голосов
/ 16 марта 2019

Я заполнил эти данные в многостолбцовом ListView1 моего приложения на C #:

студент | ДОБ | Расположение

Студент - DOB - Местоположение

Group1 AAA - 10-05-2000 - Нью-Йорк BBB - 05-02-2000 - Сан-Франциско CCC - 01-01-2000 - Вашингтон

Group2 DDD - 20-03-1999 - Чикаго EEE - 15-06-1999 - Нью-Йорк FFF - 18-09-1999 - Houstan

Я провел 4 часа, попробовал приведенный ниже код без удачи.

IEnumerable<Student> earlydatestudents = Students.GroupBy(std => std.Group)
    .Select(grp =>
    {
        DateTime dt = grp.Min(s => s.DOB);
        return grp.Where(st => st.DOB == dt);
    })
    .SelectMany(slist => slist);

var toDeleteList = Students.Except(earlydatestudents).ToList();

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 16 марта 2019

Ваш код работает. Не очень понятно, что вы хотите удалить. В заголовке указано удаление самого младшего, но toDeleteList содержит всех учеников, кроме самого младшего.

Вот как вы можете получить только одного самого младшего студента из каждой группы:

var toDeleteList = students.GroupBy(x => x.DOB.Year)   
    .Select(g => g.OrderBy(x => x.DOB).Take(1))
    .SelectMany(x => x)
    .ToList();

Здесь вы получаете всех самых маленьких учеников из каждой группы (если у некоторых из них одинаковые самые ранние DOB):

var toDeleteList = students.GroupBy(x => x.DOB.Year)
    .Select(g => g.Where(x => x.DOB == g.Min(gr => gr.DOB)))
    .SelectMany(x => x);
    .ToList();

GroupBy(x => x.DOB.Year) объединяет студентов в две группы, так как я заметил, что у всех учащихся Group1 2000 года, а у всех учащихся Group2 1999 года DOB. Я сделал это только для того, чтобы две группы студентов соответствовали вашему примеру. Конечно, вы должны группировать как хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...