equals和gethashcode
equals每个实现都必须遵循以下约定:
gethashcode:
iequalitycomparer实现
下面我们创建一个学生类,从而进一步的实现我们对象数据的对比
public class student { public string name { get; set; } public int age { get; set; } }
通过如下代码我们将通过distinct方法实现我们的过滤.
class program { static void main(string[] args) { list<student> students = new list<student> { new student{ name = "mr.a", age = 32}, new student{ name = "mr.b", age = 34}, new student{ name = "mr.a", age = 32} }; console.writeline("distinctstudents has count = {0}", students.distinct().count());//distinctstudents has count = 3 console.readline(); } }
我们需要达到的是忽略相同数据的对象,但是并没有达到我们如期的效果.因为是distinct默认比较的是对象的引用...所以这样达不到我们预期效果.那我们修改一下来实现我们预期效果.
在默认情况下equals具有以下行为:
distinct(ienumerable, iequalitycomparer)
通过使用指定的 iequalitycomparer 对值进行比较,返回序列中的非重复元素.
类型参数
参数
返回
一个包含源序列中的非重复元素的 ienumerable。
我们来看如下代码片段
public class studentcomparator : equalitycomparer<student> { public override bool equals(student x,student y) { return x.name == y.name && x.age == y.age; } public override int gethashcode(student obj) { return obj.name.gethashcode() * obj.age; } }
上述代码片段如果两个equals返回的true并且gethashcode返回相同的哈希码,则认为两个对象相等.
重写equals和gethashcode
var stu1 = new student { name = "mr.a", age = 32 }; var stu2 = new student { name = "mr.a", age = 32 }; bool result = stu1.equals(stu2); //false because it's reference equals
上述代码片段执行后结果非预期效果.我们将进一步的去实现代码,以达到预期效果....
public class student { public string name { get; set; } public int age { get; set; } public override bool equals(object obj) { var stu = obj as student; if (stu == null) return false; return name == stu.name && age == stu.age; } public override int gethashcode() { return name.gethashcode() * age; } } var stu1 = new student { name = "mr.a", age = 32 }; var stu2 = new student { name = "mr.a", age = 32 }; bool result = stu1.equals(stu2); //result is true
我们再使用linq distinct方法进行过滤和查询,同时将会检查equals和gethashcode
list<student> students = new list<student> { new student{ name = "mr.a", age = 32}, new student{ name = "mr.b", age = 34}, new student{ name = "mr.a", age = 32} }; console.writeline("distinctstudents has count = {0}", students.distinct().count()); //distinctstudents has count = 2
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
作者:@冯辉
出处:https://www.cnblogs.com/yyfh/p/12245916.html?utm_source=tuicool&utm_medium=referral
如对本文有疑问, 点击进行留言回复!!
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
C#实现获取本地内网(局域网)和外网(公网)IP地址的方法分析
网友评论