志在指尖
用双手敲打未来

C#中Equals和GetHashCode

Equals和GetHashCode
Equals每个完成都必须遵循以下约好:
自反性(Reflexive):x.equals(x)必须回来true.
对称性(Symmetric):x.equals(y)为true时,y.equals(x)也为true.
传递性(Transitive):对于任何非null的运用值x,y和z,假如x.equals(y)回来true,而且y.equals(z)也回来true,那么x.equals(z)必须回来true.
一致性(Consistence):假如屡次将目标与另一个目标比较,成果一直相同.只需未修正x和y的运用目标,x.equals(y)连续调用x.equals(y)回来相同的值l.
非null(Non-null):假如x不是null,y为null,则x.equals(y)必须为false
GetHashCode:
两个持平目标依据equals办法比较时持平,那么这两个目标中任意一个目标的hashcode办法都必须发生同样的整数。
在咱们未对目标进行修正时,屡次调用hashcode运用回来同一个整数.在同一个运用程序中屡次履行,每次履行回来的整数能够不一致.
假如两个目标依据equals办法比较不持平时,那么调用这两个目标中任意一个目标的hashcode办法,不一同的整数。但不同的目标,发生不同整数,有或许进步散列表的性能.
IEqualityComparer完成
下面咱们创立一个学生类,从而进一步的完成咱们目标数据的比照
publicclassStudent{publicstringName{get;set;}publicintAge{get;set;}
}
经过如下代码咱们将经过distinct办法完成咱们的过滤.
classProgram{staticvoidMain(string[]args){
Liststudents=newList{newStudent{Name=”MR.A”,Age=32},newStudent{Name=”MR.B”,Age=34},newStudent{Name=”MR.A”,Age=32}
};
Console.WriteLine(“distinctStudentshasCount={0}”,students.Distinct().Count());//distinctStudentshasCount=3Console.ReadLine();
}
}
咱们需求到达的是疏忽相同数据的目标,可是并没有到达咱们按期的作用.因为是distinct默许比较的是目标的引证…所以这样达不到咱们预期作用.那咱们修正一下来完成咱们预期作用.
在默许情况下Equals具有以下行为:
假如实例是引证类型,则只有引证相一起,Equals才会回来true。
假如实例是值类型,则仅当类型和值相一起,Equals才会回来true。
Distinct(IEnumerable,IEqualityComparer)
经过运用指定的IEqualityComparer对值进行比较,回来序列中的非重复元素.
类型参数
TSourcesource的元素类型。
参数
sourceIEnumerable要从中移除重复元素的序列。
comparerIEqualityComparer用于比较值的IEqualityComparer。
回来
IEnumerable
一个包含源序列中的非重复元素的IEnumerable。
咱们来看如下代码片段
publicclassStudentComparator:EqualityComparer<Student>
{publicoverrideboolEquals(Studentx,Studenty){returnx.Name==y.Name&&x.Age==y.Age;
}publicoverrideintGetHashCode(Studentobj){returnobj.Name.GetHashCode()*obj.Age;
}
}
上述代码片段假如两个Equals回来的true而且GetHashCode回来相同的哈希码,则以为两个目标持平.
重写Equals和GetHashCode
varstu1=newStudent{Name=”MR.A”,Age=32};varstu2=newStudent{Name=”MR.A”,Age=32};boolresult=stu1.Equals(stu2);//falsebecauseit’sreferenceEquals
上述代码片段履行后成果非预期作用.咱们将进一步的去完成代码,以到达预期作用….
publicclassStudent{publicstringName{get;set;}publicintAge{get;set;}publicoverrideboolEquals(objectobj){varstu=objasStudent;if(stu==null)returnfalse;returnName==stu.Name&&Age==stu.Age;
}publicoverrideintGetHashCode(){returnName.GetHashCode()*Age;
}
}varstu1=newStudent{Name=”MR.A”,Age=32};varstu2=newStudent{Name=”MR.A”,Age=32};boolresult=stu1.Equals(stu2);//resultistrue
咱们再运用LINQDistinct办法进行过滤和查询,一起将会检查Equals和GetHashCode
Liststudents=newList{newStudent{Name=”MR.A”,Age=32},newStudent{Name=”MR.B”,Age=34},newStudent{Name=”MR.A”,Age=32}
};
Console.WriteLine(“distinctStudentshasCount={0}”,students.Distinct().Count());//distinctStudentshasCount=2

未经允许不得转载:IT技术网站 » C#中Equals和GetHashCode
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载