webentwicklung-frage-antwort-db.com.de

So erhalten Sie mit Linq die erste Aufzeichnung in jeder Gruppe

Unter Berücksichtigung der folgenden Aufzeichnungen:

   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

Ich möchte eine Gruppierung basierend auf dem F1 Feld und sortiere nach Id und erhalte alle Felder aus dem ersten Datensatz der Gruppe, die diesen Datensätzen ähnlich sind:

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

Wie kann ich das mit linq machen?

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

Die Antwort von @Alireza ist völlig korrekt, aber Sie müssen dies beachten, wenn Sie diesen Code verwenden

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

dies ähnelt diesem Code, weil Sie die Liste bestellen und dann die Gruppierung vornehmen, sodass Sie die erste Reihe von Gruppen erhalten

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

Wenn Sie etwas Komplexeres tun möchten, wie das gleiche Gruppierungsergebnis, aber das erste Element von F2 und das letzte Element von F3 oder etwas Brauchbareres, können Sie dies tun, indem Sie den folgenden Code studieren

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

Also wirst du sowas bekommen

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

Verwenden Sie es, um das zu erreichen, was Sie wollen. Entscheiden Sie dann, welche Eigenschaften Sie zurückgeben möchten.

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