Как я могу сделать Группу по свойству и получить первую запись из любых групп с помощью lambda linq? - PullRequest
0 голосов
/ 01 апреля 2020

Мой объект (Фото) имеет 3 свойства (ID, Имя, Фото)

ID     Name     Photo  
***********************
1      a        1.jpg
2      a        2.jpg
3      b        3.jpg
4      b        4.jpg
5      c        5.jpg
*************************
How can i get first record in groupby(name) by using linq lambda? like below table

ID     Name     Photo  
**********************
1      a        1.jpg
3      b        3.jpg
5      c        5.jpg
***********************

Я использую этот код:

photos.GroupBy(x => x.Name).FirstOrDefault();

Но результат просто (имя: а) и мне нужны (ID, имя, фотография) значения

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Когда вы делаете GroupBy(), результатом будет IEnumerable из IGrouping<,> с. В вашем случае это будет IGrouping<string, Photo>. Поэтому, когда вы пытаетесь получить доступ к первому элементу, вы получаете не первый Photo, а первый IGrouping, который будет содержать два элемента в примере.

Правильный способ получения первого Photo первой группы будет выглядеть примерно так:

var firstGroup = photos.GroupBy(x => x.Name).OrderBy(y => y.Key).First(); //or FirstOrDefatult() if you prefer
Photo firstPhotoInGroup = firstGroup.First(); 

Получив группу, вы можете использовать ее как IEnumerable со свойством Key.

1 голос
/ 01 апреля 2020
photos.GroupBy(p => p.Name).Select(p => p.First()).ToList();
0 голосов
/ 01 апреля 2020

Я думаю, что вам, возможно, понадобится не то, что имеет принятый ответ - принятый ответ предполагает, что список уже отсортирован в том порядке, в котором он должен быть (по идентификатору), и захватывает первый. Следующее решение группирует по Имени, но затем захватывает минимум по ИД в этой группе и собирает его:

IEnumerable<MetaPhoto> minPhotos = photos
    .GroupBy(photo => photo.Name)
    .SelectMany(photoGroup => photoGroup, (photoGroup, photo) => new { PhotoGroup = photoGroup, Photo = photo })
    .Where(photoGroupPhoto => photoGroupPhoto.Photo.ID == photoGroupPhoto.PhotoGroup.Min(photo => photo.ID))
    .Select(photoGroupPhoto => photoGroupPhoto.Photo);
...