2013-07-31 37 views
1

在我的項目中,我遇到了一個嚴重問題:我收集了一個集合中的所有Employee s。一些Employee S的具有相同LName如何使用linq獲取所有重複記錄

public class Employee 
{ 
    public int ID { get; set; } 
    public string FName { get; set; } 
    public string MName { get; set; } 
    public string LName { get; set; } 
    public DateTime DOB { get; set; } 
    public char Gender { get; set; } 
} 

public class MyClass 
{ 
    public List<Employee> GetAll() 
    { 
     List<Employee> empList = new List<Employee>(); 
     empList.Add(new Employee() 
     { 
      ID = 1, 
      FName = "John", 
      MName = "", 
      LName = "Shields", 
      DOB = DateTime.Parse("12/11/1971"), 
      Gender = 'M' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 2, 
      FName = "Mary", 
      MName = "Matthew", 
      LName = "Jacobs", 
      DOB = DateTime.Parse("01/17/1961"), 
      Gender = 'F' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 3, 
      FName = "Amber", 
      MName = "Carl", 
      LName = "Agar", 
      DOB = DateTime.Parse("12/23/1971"), 
      Gender = 'M' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 4, 
      FName = "Kathy", 
      MName = "", 
      LName = "Foxsss", 
      DOB = DateTime.Parse("11/15/1976"), 
      Gender = 'F' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 5, 
      FName = "Lena", 
      MName = "Ashco", 
      LName = "Bilton", 
      DOB = DateTime.Parse("05/11/1978"), 
      Gender = 'F' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 6, 
      FName = "Susanne", 
      MName = "", 
      LName = "Buck", 
      DOB = DateTime.Parse("03/7/1965"), 
      Gender = 'F' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 7, 
      FName = "Jim", 
      MName = "", 
      LName = "Hooks", 
      DOB = DateTime.Parse("09/11/1972"), 
      Gender = 'M' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 8, 
      FName = "Jane", 
      MName = "G", 
      LName = "Hooks", 
      DOB = DateTime.Parse("12/11/1972"), 
      Gender = 'F' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 9, 
      FName = "Robert", 
      MName = "", 
      LName = "Fox", 
      DOB = DateTime.Parse("06/28/1964"), 
      Gender = 'M' 
     }); 
     empList.Add(new Employee() 
     { 
      ID = 10, 
      FName = "Cindy", 
      MName = "Preston", 
      LName = "Fox", 
      DOB = DateTime.Parse("01/11/1978"), 
      Gender = 'M' 
     }); 

     return empList; 
    } 
} 

我怎樣才能從我的收藏使用LINQ重複記錄(基於LName)?

+1

您應該閱讀[Collection Initializers](http://msdn.microsoft.com/zh-cn/library/vstudio/bb384062.aspx)。另外,當使用對象初始值設定項時,括號是多餘的:) – khellang

回答

6

目前尚不清楚,但看起來你正在尋找以下:由LName

var duplicates = GetAll().GroupBy(x => x.LName) 
         .Where(g => g.Count() > 1) 
         .SelectMany(g => g) 
         .ToList() 

這組元素,只需要具有超過1元組,將它們作爲一個列表。

duplicates將是List<Employee>

你可以把它更好一點使用ToDictionary代替ToList

var duplicates = GetAll().GroupBy(x => x.LName) 
         .Where(g => g.Count() > 1) 
         .ToDictionary(g = > g.Key, g.ToList()); 

這將是Dictionary<string, List<Employee>>,具有LName作爲字典鍵,給定LNameValue的產品清單。

+0

爲什麼'.ToLookup(g => g.Key)'?看起來比'.ToDictionary(g => g.Key,g.ToList())'更清潔很多。' –

+0

@pswg是的,它可能是查找:) – MarcinJuraszek

+0

@pswg抱歉,但當我使用.ToLookup(g = > g.Key),那麼它會給我不同的重複記錄,但我不會重複記錄不清楚。 – Rajpurohit

1

您不需要爲給定的鍵完整計數;你實際上可以更有效一些,並且仍然清楚地表達出重複的意思。要重複檢查,你只需要檢查你跳過的第一個項目後,看看是否有任何剩餘

var duplicates = GetAll().GroupBy(x => x.LName) 
         .Where(g => g.Skip(1).Any()) 
         .SelectMany(g => g); 

如果您需要ToList可以將此轉換到一個列表。或者你可以說:

var duplicates = GetAll().GroupBy(x => x.LName) 
         .Where(g => g.Skip(1).Any()) 
         .ToLookup(g => g.Key); 

讓他們收集Employee.LName