C#中Equals和GetHashCode

news/2024/7/4 9:10:57

Equals和GetHashCode

清风小说 www.198200.com

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实现

下面我们创建一个学生类,从而进一步的实现我们对象数据的对比

    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具有以下行为:

  • 如果实例是引用类型,则只有引用相同时, Equals才会返回true。
  • 如果实例是值类型,则仅当类型和值相同时, Equals才会返回true。

Distinct(IEnumerable, IEqualityComparer)

通过使用指定的 IEqualityComparer 对值进行比较,返回序列中的非重复元素.

类型参数

  • TSource source 的元素类型。

    参数

  • source IEnumerable 要从中移除重复元素的序列。
  • comparer IEqualityComparer 用于比较值的 IEqualityComparer。

返回

  • IEnumerable
    一个包含源序列中的非重复元素的 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

http://www.niftyadmin.cn/n/748905.html

相关文章

绿色版 MySQL 安装配置的正确操作步骤

文章主要向大家介绍的是绿色版 MySQL 安装配置的实际操作流程&#xff0c;我们是在MySQL5.1版的环境下对色版 MySQL进行正确的安装配置&#xff0c;以及对其具体的下载地址有一详细介绍&#xff0c;以下就是文章的详细内容介绍。 绿色版 MySQL 安装配置&#xff1a; 本人下载…

图像灰度变换、二值化、直方图

1、灰度变换 1&#xff09;灰度图的线性变换 Gnew Fa * Gold Fb。 Fa为斜线的斜率&#xff0c;Fb为y轴上的截距。 Fa>1 输出图像的对比度变大&#xff0c;否则变小。 Fa1 Fb≠0时&#xff0c;图像的灰度上移或下移&#xff0c;效果为图像变亮或变暗。 Fa-1&#xff…

Struts2与Struts1的比较摘录整理

特性Struts1.xStruts2Action类Struts1.x要求Action类要扩展自一个抽象基类。Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。Struts2的Action类实现了一个Action接口&#xff0c;连同其他接口一起来实现可选择和自定义的服务。Struts2提供一个名叫ActionSuppor…

《HelloGitHub》第 46 期

兴趣是最好的老师&#xff0c;HelloGitHub 就是帮你找到兴趣&#xff01; 简介 米妮小说网 www.amini.net 分享 GitHub 上有趣、入门级的开源项目。 这是一个面向编程新手、热爱编程、对开源社区感兴趣 人群的月刊&#xff0c;月刊的内容包括&#xff1a;各种编程语言的项目、…

好的程序员也是一名优秀的管理者

好的程序员也是一名优秀的管理者&#xff0c;只不过他管理的对象是代码&#xff0c;而且是自己创建的。而企业管理者的管理对象基本都是买回来的&#xff0c;不过一样有重构、重组&#xff0c;分部门&#xff0c;开会&#xff0c;信息要沟通&#xff0c;资源要分配&#xff0c;…

Spring 总结

原文&#xff1a;http://blog.csdn.net/xwchen/archive/2007/04/06/1554245.aspx spring 7大组成模块&#xff1a; 1:spring core&#xff1a;提供了spring 的核心功能&#xff0c;BeanFactory是spring核心容器的主要组件&#xff0c; 它通过Ioc把程序的配置和依赖性与实…

C++ 一篇搞懂多态的实现原理

虚函数和多态 不格 m.vbuge.com 01 虚函数 在类的定义中&#xff0c;前面有 virtual 关键字的成员函数称为虚函数&#xff1b;virtual 关键字只用在类定义里的函数声明中&#xff0c;写函数体时不用。 class Base {virtual int Fun() ; // 虚函数 };int Base::Fun() // virt…

CSS层级嵌套关系详解

如果同个元素有两个或以上冲突的CSS规则&#xff0c;浏览器有一些基本的规则来决定哪一个非常特殊而胜出。 它可能不像其它那么重要&#xff0c;大部分案例你不需要担心冲突&#xff0c;但大型而且复杂的CSS文件&#xff0c;或有很多CSS文件组成的&#xff0c;可能产生冲突。 选…