web-dev-qa-db-ja.com

Linqを使用して各グループの最初のレコードを取得する方法

次の記録を考慮してください。

   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

F1フィールドに基づいてグループ化し、Idでソートし、これらのレコードと同様のグループの最初のレコードからすべてのフィールドを取得します。

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

Linqを使用してこれを行うにはどうすればよいですか?

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

@Alirezaのオーナは完全に正しいですが、このコードを使用するときは注意する必要があります

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

リストを順序付けしてからグループ化を実行してグループの最初の行を取得するため、このコードと似ています

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

同じグループ化結果を取得するが、F2の最初の要素とF3の最後の要素、またはよりカスタムなものを取得するなど、より複雑な操作を行いたい場合は、コードを追加してください。

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

だからあなたは次のようなものを得るでしょう

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

あなたが望むものを達成するためにそれを使用してください。次に、返すプロパティを決定します。

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