web-dev-qa-db-fra.com

Comment obtenir le premier enregistrement de chaque groupe avec Linq

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 grouper par basé sur le champ F1 et trier par Id et obtenir tous les champs du premier enregistrement du groupe semblable à 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?

120
Arian
    var res = from element in list
              group element by element.F1
                  into groups
                  select groups.OrderBy(p => p.F2).First();
118
Alireza
var result = input.GroupBy(x=>x.F1,(key,g)=>g.OrderBy(e=>e.F2).First());
155
King King

L’avertisseur de @Alireza est tout à fait correct, 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();

ce qui est similaire à ce code parce que vous commandez la liste puis faites le regroupement pour obtenir la première ligne de 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
6
Stavros Koureas

Utilisez-le pour réaliser ce que vous voulez. Ensuite, décidez quelles propriétés vous souhaitez retourner.

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