173 votes

Comment obtenir le premier enregistrement de chaque groupe en utilisant Linq

En considérant les enregistrements suivants :

   Id          F1            F2             F3 
 -------------------------------------------------
   1           Nima          1990           10
   2           Nima          1990           11
   3           Nima          2000           12
   4           John          2001           1
   5           John          2002           2 
   6           Sara          2010           4

Je veux regrouper en fonction du champ F1 et trier par Id et obtenir tous les champs du premier enregistrement du groupe similaire à ces enregistrements :

   Id          F1            F2             F3 
 -------------------------------------------------
   1           Nima          1990           10
   4           John          2001           1
   6           Sara          2010           4

Comment puis-je faire cela en utilisant Linq ?

2voto

Adam Silenko Points 2397

Une autre façon :

var result = input.GroupBy(i => i.F1).Select(g => g.First());

Vous pouvez regrouper par plusieurs champs :

var result = input.GroupBy(i => new {i.F1, i.F2}).Select(g => g.First());

Si vous avez besoin de conserver l'ordre, utilisez lookup :

var result = input.ToLookup(i => i.F1).Select(g => g.First());

-1voto

rapturemachine Points 143

Ce n'est pas exactement ce que vous cherchiez, mais parfois nous cherchons la mauvaise chose car nous ne savons pas ce qui existe. Donc ma solution que je trouve la plus intuitive :

var dict = 
input.OrderByDescending(x => x.Id)
     .GroupBy(x => x.F1)
     .ToDictionary(x => x.Key, x => new { x.First().F1, x.First().F2, x.First().F3});

D'abord classer, puis grouper - simple. Maintenant, le résultat sera une liste de paires clé-valeur. Comme notre tableau était déjà trié, nous pouvons simplement choisir la première entrée. Je conseille également de mettre le résultat dans un dictionnaire avec l'ID comme accesseur, c'est une structure de données très rapide pour accéder et toujours flexible. Maintenant, vous pouvez y accéder en utilisant

dict[4].F1 // retourne Nima

techniquement c'est IEnumerable>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X