2016-10-18 2 views
1

Есть ли какой-то способ в группе linq? Id, Order По убыванию, а затем выберите верхнюю пятую каждой группы? Прямо сейчас у меня есть код, показанный ниже, но я использовал .Take(5), и он явно выбирает верхние 5 независимо от группировки.Linq - Group By Id, Order By и Then select top 5 каждой группы

Items = list.GroupBy(x => x.Id) 
      .Select(x => x.OrderByDescending(y => y.Value)) 
      .Select(y => new Home.SubModels.Item { 
       Name= y.FirstOrDefault().Name, 
       Value = y.FirstOrDefault().Value, 
       Id = y.FirstOrDefault().Id 
      }) 

ответ

1

Вы почти находитесь. Используйте Take в Select заявлении:

var items = list.GroupBy(x => x.Id) 
       //For each IGrouping - order nested items and take 5 of them   
       .Select(x => x.OrderByDescending(y => y.Value).Take(5)) 

Это возвращает IEnumerable<IEnumerable<T>>. Если вы хотите, чтобы он сплющил, замените Select на SelectMany

+0

Я использовал ваш первоначальный ответ с помощью selectmany, и он отлично работает. Спасибо вам за помощь! –

+0

@BadDub - вы очень приветствуетесь :) –

+1

Я ждал времени, чтобы спуститься :) –