Linq kullanarak her grupta ilk kayıt nasıl elde edilir


133

Aşağıdaki kayıtlar dikkate alındığında:

   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

Ben F1alana göre gruplandırmak ve sıralamak Idve grubun ilk kayıt bu kayıtlara benzer tüm alanları almak istiyorum:

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

Bunu linq kullanarak nasıl yapabilirim?

Yanıtlar:


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

4
Bunu bulduğum için çok mutluyum. "İlk 'yöntemi yalnızca son sorgu işlemi olarak kullanılabilir. Bu durumda' FirstOrDefault 'yöntemini kullanmayı düşünün." örneğinizden. Sorgu bir yönteme myResult.ToList () geçtikten sonra ben sadece listedeki işlem. FirstOrDefault kullanmak yine de çözdü
aghost

Olur mu OrderBy(p => p.Id), yıl sütununa göre kimlikle sipariş edilmesini istediler.
Mike Flynn

Bunun için lütfen biraz yardım sağlayabilir misiniz: stackoverflow.com/questions/44764687/…
Si8

İlk ve son öğeyi gruptan almak isterseniz ne olur?
Sandeep Pandey

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

2
Bu bana Fluent sözdizimini kullanmanın yolunu gösterdi. GroupBy için aşırı yükler öğrenme uzun listesine eklemek için bir - size çok fazla güç vermek için görünür!
rogersillito

1
@rogersillito bu yüzden bir sorgu (Dil Entegre Sorgu - LINQ) olarak adlandırılır, ayrıca GroupBy'nin birçok aşırı yüklemesi vardır, ancak yaygın olarak kullanılan birkaç şey vardır, ayrıca bazılarının bunu tercih etmeleri gibi kişisel tercihlere bağlıdır .GroupBy(x=>x.F1).Select(g=>...), anlamak daha kolay görünebilir.
Kral Kral

11
Sen değiştirmelisiniz .First()ile .FirstOrDefault()ya da istisna alacak:The method 'First' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead.
Nikolay Kostov

5
@NikolayKostov Bunu biliyorum, ama burada LINQ'nun LINQ'dan objelere değil, LINQ'dan nesneye kullanıldığı varsayılmıştır, bu yüzden güvenle kullanabiliriz .First(). OP'nin sorusu gerçekten soruyu linq-to-object hakkında önemsemeye benziyor, ancak soruyu da etiketledi linq-to-entities(bunun ne olduğunu anladığından emin değil).
King King

1
Bu cevapları beğendim, Güzel.
Ajas Aju

8

@Alireza'nın awnseri tamamen doğrudur, ancak bu kodu kullanırken dikkat etmelisiniz.

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

listeyi sipariş ettiğiniz ve gruplandırmayı yaptığınız için bu koda benzerdir, böylece grupların ilk sırasını alırsınız

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

Şimdi aynı gruplama sonucunu almak gibi daha karmaşık bir şey yapmak istiyorsanız, ancak F2'nin ilk öğesini ve F3'ün son öğesini veya daha özel bir şeyi almak istiyorsanız, aşağıdaki kodu çalıştırarak yapabilirsiniz

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

Yani böyle bir şey alacaksın

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

1
Yeni nesnenin ayırıcısı veya ayırıcısı noktalı virgül değil virgül olmalıdır.
Naredla Nithesh Reddy

3

İstediğinizi elde etmek için kullanın. Ardından hangi özellikleri iade etmek istediğinize karar verin.

yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.