c# – 比较两个列表并忽略特定属性

c# – 比较两个列表并忽略特定属性,第1张

概述我有两个员工名单,我想从中获得唯一的记录,但这有一个扭曲.每个列表中都有一个Employee类: public class Employee{// I want to completely ignore ID in the comparisonpublic int ID{ get; set; }// I want to use FirstName and LastName in com 我有两个员工名单,我想从中获得唯一的记录,但这有一个扭曲.每个列表中都有一个Employee类:
public class  Employee{// I want to completely ignore ID in the comparisonpublic int ID{ get; set; }// I want to use Firstname and Lastname in comparisonpublic string Firstname{ get; set; }public string Lastname{ get; set; }}

我想要匹配的唯一属性是Firstname和Lastname.我想在比较中完全忽略ID. allFulltimeEmployees列表中有3名员工,allParttimeEmployees列表中有3名员工.名单上的两个项目的名字和姓氏相匹配 – 莎莉琼斯和弗雷德杰克逊.列表中有一个项不匹配,因为Firstname是相同的,但Lastname不同:

emp.ID = null; // not populated or used in comparisonemp.Firstname = "Joe"; // sameemp.Lastname = "Smith"; // differentallFulltimeEmployees.Add(emp);emp.ID = 3; // not used in comparisonemp.Firstname = "Joe"; // a matchemp.Lastname = "Williams"; // not a match - different last nameallParttimeEmployees.Add(emp);

所以我想在比较两个列表时忽略类中的ID属性.我想将乔·威廉姆斯标记为不匹配,因为两个名单中史密斯和威廉姆斯的姓氏不匹配.

// finalResult should only have Joe Williams in it var finalResult = allFulltimeEmployees.Except(allParttimeEmployees);

我尝试过使用IEqualityComparer,但它不起作用,因为它在参数中使用单个Employee类而不是IEnumerable列表:

public class EmployeeEqualityComparer : IEqualityComparer<Employee>    {        public bool Equals(Employee x,Employee y)        {            if (x.Firstname == y.Firstname && x.Lastname == y.Lastname)            {                return true;            }            else            {                return false;            }        }        public int GetHashCode(Employee obj)        {            return obj.GetHashCode();        }    }

如何成功完成我想要的 *** 作并执行此 *** 作?谢谢你的帮助!

解决方法 你使用IEqualityComparer的想法很好,这是你的执行错误.值得注意的是,您的GetHashCode方法.
public int GetHashCode(Employee obj) {     return obj.GetHashCode(); }

IEqualityComparer定义了Equals和GetHashCode,因为两者都很重要.实现此接口时不要忽略GetHashCode!它在平等比较中起着关键作用.不,这并不表示两个项目是相等的,但它表明两个元素不相同.两个相等的元素必须返回相同的哈希码.如果他们不这样做,他们就不能被认为是平等的.如果他们这样做,那么他们可能是平等的,而平等功能只会继续探索Equals.

将实现委托给实际雇员对象的GetHashCode方法,您依赖于Employee类使用的实现.只有当该实现被覆盖时,它才对您有用,并且只有在使用您的关键字段时才有用.如果是,那么您很可能首先不需要定义自己的外部比较器!

构建一个GetHashCode方法,该方法会影响您的关键字段,并且您将进行设置.

public int GetHashCode(Employee obj){     // null handling omitted for brevity,but you will want to     // handle null values appropriately     return obj.Firstname.GetHashCode() * 117           + obj.Lastname.GetHashCode(); }

一旦你有了这个方法,那么在你的Except调用中使用comparer.

var comparer = new EmployeeEqualityComparer();var results = allFulltimeEmployees.Except(allParttimeEmployees,comparer);
总结

以上是内存溢出为你收集整理的c# – 比较两个列表并忽略特定属性全部内容,希望文章能够帮你解决c# – 比较两个列表并忽略特定属性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存