2016-04-14 34 views
1

我試圖找出如何選擇只具有最低ID的對象選擇最低ID組,如果名稱是一樣的:LINQ的GroupBy - 按名稱

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?) 

回答

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

如果名稱相同,只選擇ID最小的對象

所以這隻返回那些重複的,如果有的話一個重複的然後它返回最小id的記錄。上面的例子會返回2個項目,並忽略那些沒有找到重複名稱的項目。如果這是不正確的,那麼在沒有where子句的情況下使用這個版本。

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

不知道爲什麼downvote。也許我不明白這個要求? – Igor

2

類似的東西:

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

這會給你用最低的鑰匙的所有名稱。

1

您可以使用MinBy從MoreLINQ

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