如何使用LINQ查找重复的对象

时间:2015-08-27 17:02:54

标签: c# linq

我有一个Employee类,其中包含以下内容:

public class Employee
{
  //EmployeeNumber cannot be the same as the Id
  public int EmployeeNumber {get; set; }
  public string EmployeeName {get; set }
}

最终,我将与新员工一起更新数据库。我有一个新员工的列表,我有一个数据库中存在的当前员工的列表。员工姓名可以相同,但EmployeeNumber必须是唯一的。我想最终得到一份重复员工的列表,这些员工是通过比较我将添加到数据库的列表以及代表数据库内部的员工列表而创建的。

使用LINQ获取重复员工列表的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

我不确定它是否最有效(该奖项归于@Fahdd的评论)。

假设您的确指的是“如何获取出现在两个集合中的记录列表”,我希望使用JoinGroupJoin方法,因为您可以选择新的集合,或者包含两个集合中记录的匿名类型。

语法是 Join (this collection1, collection2, FuncCollection1Key, Funccollection2Key, FuncOutputSelection).

因此,如果您的“新”集合是IEnumerable NewEmployees,而您现有的集合是IEnumerable<Employee> DbEmployees,则您的重复员工集合来自:

var DupeEmployees = NewEmployees.Join(DbEmployees, n=>n.EmployeeNumber, d=>d.EmployeeNumber, (nEmp,dbEmp)=>nEmp);

两个“中间”lambda表达式必须是导致相同类型值(实现IEquatable)的函数,但没有其他限制。你有两个不同类型的集合,你可以输出你喜欢的任何东西。

现在,最佳方式是Farhad的建议,在这种情况下使用Join有点像用大象枪射击蜜蜂,但是要理解Join将为您带来许多好处。

答案 1 :(得分:1)

您可以实现IEqualityComparer并使用LinQ方法&#34;除了&#34;

public class MyComparer : IEqualityComparer<Employee>
{
    public bool Equals(Employee x, Employee y)
    {
        return x.EmployeeNumber.Equals(y.EmployeeNumber);
    }

    public int GetHashCode(Employee x)
    {
        return x.EmployeeNumber.GetHashCode()
    }
}

答案 2 :(得分:0)

您只需检查新员工列表中当前员工的员工编号是否可用。

 List<Employee> currentEmployees = ...
 List<Employee> newEmployees = ...

 List<Employee> duplicateEmployees = currentEmployees.Where(currentEmployee => (newEmployees.Select(f => f.EmployeeNumber)).Contains(currentEmployee.EmployeeNumber)).ToList();