2016-04-14 14 views
1
Ben en düşük kimliği ile sadece nesneyi seçmek anlamaya çalışıyorum

tarafından düşük Kimlik grubunu seçin ise:LINQ GroupBy - İsim aynı adı

public class BasicInfo 
{ 
    public int Id {get;set;} 
    public string Name {get; set;} 
} 

List<BasicInfo> BasicInfos = new List<BasicInfo>(); 
BasicInfos.Add(new BasicInfo() { Id = 1, Name = "John" }); 
BasicInfos.Add(new BasicInfo() { Id = 2, Name = "John" }); 

BasicInfos = BasicInfos.GroupBy(y => y.Name)...(What goes here?) 

cevap

2
BasicInfos = BasicInfos.GroupBy(y => y.Name) 
    .Select(y => y.OrderBy(z => z.Id).First()) 
-1
List<BasicInfo> BasicInfos = new List<BasicInfo>(); 
BasicInfos.Add(new BasicInfo() { Id = 1, Name = "John" }); 
BasicInfos.Add(new BasicInfo() { Id = 2, Name = "John" }); 
BasicInfos.Add(new BasicInfo() { Id = 3, Name = "Sam" }); 
BasicInfos.Add(new BasicInfo() { Id = 4, Name = "Sam" }); 
BasicInfos.Add(new BasicInfo() { Id = 5, Name = "Igor" }); 
BasicInfos.Add(new BasicInfo() { Id = 6, Name = "joei" }); 

var usersWithSameName = BasicInfos.GroupBy(x => x.Name) 
    .Where(x => x.Count() > 1) 
    .Select(x => x.Single(y => y.Id == x.Min(z => z.Id))); 

Ad aynıysa, yalnızca en düşük ID olan nesneyi seçin.

Bu nedenle, yinelenen ve varsa bir kopya daha sonra en küçük id ile kaydı döndürür. Yukarıdaki örnek, 2 öğeyi döndürür ve yinelenen adın bulunamayacağı öğeleri dikkate almaz. Bu doğru değilse, bu sürümü nerede kullanmadan kullanın. Böyle

var usersWithSameName = BasicInfos.GroupBy(x => x.Name) 
    .Select(x => x.Single(y => y.Id == x.Min(z => z.Id))); 
+0

niçin downvote emin değilim. Belki de şartı anlamadım? – Igor

2

şey:

BasicInfos = BasicInfos.GroupBy(y => y.Name) 
         .Select(y => new BasicInfo{ Name = y.Key, Id = y.Min(x => x.Id)); 

Bu, düşük anahtar ile tüm adları verecektir.

1

Sen MoreLINQ den MinBy kullanabilirsiniz:

var lowestIDsByName = BasicInfos.GroupBy(bi => bi.Name) 
    .Select(g => g.MinBy(bi => bi.Id)) 
    .ToList();