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 ?

237voto

King King Points 30608
var result = input.GroupBy(x => x.F1, (key,g) => g.OrderBy(e => e.F2).First());

154voto

Alireza Points 2767
var res = from element in list
          group element by element.F1
              into groups
              select groups.OrderBy(p => p.F2).First();

15voto

s19k15 Points 47

La réponse de @Alireza est totalement correcte, mais vous devez remarquer que lorsque vous utilisez ce code

var res = from element in list
          group element by element.F1
              into groups
              select groups.OrderBy(p => p.F2).First();

qui est similaire à ce code car vous triez la liste puis faites le regroupement, vous obtenez la première ligne des groupes

var res = (from element in list)
          .OrderBy(x => x.F2)
          .GroupBy(x => x.F1)
          .Select()

Maintenant, si vous voulez faire quelque chose de plus complexe comme prendre le même résultat de regroupement mais prendre le premier élément de F2 et le dernier élément de F3 ou quelque chose de plus personnalisé, vous pouvez le faire en étudiant le code ci-dessous

 var res = (from element in list)
          .GroupBy(x => x.F1)
          .Select(y => new
           {
             F1 = y.FirstOrDefault().F1;
             F2 = y.First().F2;
             F3 = y.Last().F3;
           });

Donc vous obtiendrez quelque chose comme

   F1            F2             F3 
 -----------------------------------
   Nima          1990           12
   John          2001           2
   Sara          2010           4

4voto

Rubens Mussi Cury Points 143

Utilisez-le pour obtenir ce que vous voulez. Ensuite, décidez quelles propriétés vous voulez renvoyer.

yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)

2voto

goro Points 21
var res = (de l'élément dans la liste)
      .OrderBy(x => x.F2).AsEnumerable()
      .GroupBy(x => x.F1)
      .Select()

Utilisez .AsEnumerable() après OrderBy()

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