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
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com