二个List的数据集为何不能Except
有一个类,然后二个这个类的数据集,为何这二个数据集相减号,等不出正确答案。
class Employee
{
private int id;
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public int Id
{
get { return id; }
set { id = value; }
}
}
List<Employee> emplist1 = new List<Employee>() { new Employee() { Id = 1, Name = "Scott" }, new Employee() { Id = 2, Name = "Lilly" }, new Employee() { Id = 3, Name = "Peter" } };
List<Employee> emplist2 = new List<Employee>() { new Employee() { Id = 1, Name = "Scott" }, new Employee() { Id = 4, Name = "Kate" } };
foreach (var r in emplist1.Except(emplist2))
{
Console.WriteLine("{0},{1}", r.Id, r.Name);
}
Console.ReadKey();
[解决办法]
- C# code
void Main(){ List<Employee> emplist1 = new List<Employee>() { new Employee() { Id = 1, Name = "Scott" }, new Employee() { Id = 2, Name = "Lilly" }, new Employee() { Id = 3, Name = "Peter" } }; List<Employee> emplist2 = new List<Employee>() { new Employee() { Id = 1, Name = "Scott" }, new Employee() { Id = 4, Name = "Kate" } }; foreach (var r in emplist1.Except(emplist2,new EmployeeComparer())) { Console.WriteLine("{0},{1}", r.Id, r.Name); } /* 2,Lilly 3,Peter */}class Employee { private int id; private string name; public string Name { get { return name; } set { name = value; } } public int Id { get { return id; } set { id = value; } } } class EmployeeComparer : IEqualityComparer<Employee>{ // Products are equal if their names and product numbers are equal. public bool Equals(Employee x, Employee y) { //Check whether the compared objects reference the same data. if (Object.ReferenceEquals(x, y)) return true; //Check whether any of the compared objects is null. if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; //Check whether the products' properties are equal. return x.Id == y.Id && x.Name == y.Name; } // If Equals() returns true for a pair of objects // then GetHashCode() must return the same value for these objects. public int GetHashCode(Employee ep) { //Check whether the object is null if (Object.ReferenceEquals(ep, null)) return 0; //Get hash code for the Name field if it is not null. int hashEmployeeName = ep.Name == null ? 0 : ep.Name.GetHashCode(); //Get hash code for the Code field. int hashEmployeeId = ep.Id.GetHashCode(); //Calculate the hash code for the product. return hashEmployeeName ^ hashEmployeeId; }}
[解决办法]
http://msdn.microsoft.com/en-us/library/bb336390.aspx