2016-10-18 9 views
1

Y a-t-il un moyen dans le groupe linq Par identifiant, trier par ordre décroissant, puis sélectionner le top 5 de chaque groupement? En ce moment j'ai un peu de code ci-dessous, mais j'ai utilisé .Take(5) et il sélectionne évidemment le top 5 indépendamment du groupement.Linq - Grouper par ID, trier par et puis sélectionner le top 5 de chaque groupement

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 
      }) 

Répondre

1

Vous y êtes presque. Utilisez Take dans la déclaration 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)) 

Cela renverra un IEnumerable<IEnumerable<T>>. Si vous voulez l'aplatir remplacez Select par SelectMany

+0

J'ai utilisé votre réponse initiale avec le selectmany et cela fonctionne parfaitement. Merci pour l'aide! –

+0

@BadDub - vous êtes les bienvenus :) –

+1

J'attendais le temps de descendre :) –