首页 > 其他分享 >自定义类型的相等判断

自定义类型的相等判断

时间:2023-07-14 17:47:58浏览次数:39  
标签:相等 return 自定义 IEquatable Age Equals 判断 Student public

实现自定义类型的相等性判断(参考链接),步骤如下:

  1. 重写Object.Equals(object)方法,调用IEquatable.Equals(T)进行实现;
  2. 实现IEquatable接口,在Equals(T)方法中进行自定义的相等性判断。实现时应先进行运行时类型判断,运行时类型相同才相同,然后判断关键字段是否相等;
  3. 重载==与!=运算符,非必要,但建议进行重载;
  4. 重写Object.GetHashCode()方法;

如自定义类型Student:

class Student : IEquatable<Student>
{
    public int Id { get; set; }

    public string Name { get; set; } = string.Empty;

    public int Age { get; set; }
    
    public string Remark { get; set; }

    #region IEquatable<T>实现
    // 重写Object.Equals(object)
    public override bool Equals(object obj)
    {
        return Equals(obj as Student);
    }
    
    // 实现IEquatable<T>接口
    public bool Equals(Student other)
    {
        if (other is null)
            return false;

        if (Object.ReferenceEquals(this, other))
            return true;

        // 运行时类型判断
        if (this.GetType() != other.GetType())
            return false;
        
        // 判断字段是否相等
        return Id == other.Id 
            && Name == other.Name 
            && Age == other.Age;
    }

    // 重写Object.GetHashCode()
    public override int GetHashCode()
    {
        return HashCode.Combine(Id, Name, Age);
    }
 
    // 运算符重载
    public static bool operator ==(Student left, Student right)
    {
        if (left is null)
        {
            if (right is null)
                return true;

            return false;
        }
        
        return left.Equals(right);
    }

    public static bool operator !=(Student left, Student right) => !(left == right);
    #endregion
}

看着很麻烦,代码那么多,其实,通过VS快速操作和重构可以快速实现IEquatable...

实现了IEquatable接口,就可以按照我们自定义的相等条件判断两个实例是否相等了,如果需要判断两个集合是否相等,使用Enumerable.SequenceEqual()方法:

public void StudentEqualTest()
{
    Student A = new Student { Id = 1, Name = "张三", Age = 18, Remark = "A" };
    Student B = new Student { Id = 1, Name = "张三", Age = 18, Remark = "B" };
    Student C = new Student { Id = 2, Name = "李四", Age = 20, Remark = "C" };

    Console.WriteLine($"instance A == instance B : {A == B}"); // true
    Console.WriteLine($"instance A == instance C : {A == C}"); // false

    List<Student> list1 = new List<Student> { A, C};
    List<Student> list2 = new List<Student> { B, C };

    Console.WriteLine($"list1 == list2 : {list1.SequenceEqual(list2)}"); // true
    B.Age = 19;
    Console.WriteLine($"after change B.Age, list1 == list2 : {list1.SequenceEqual(list2)}"); // false
}

标签:相等,return,自定义,IEquatable,Age,Equals,判断,Student,public
From: https://www.cnblogs.com/louzixl/p/17554569.html

相关文章

  • 自定义图标偏移问题
    在地图开发中使用自定义图标(icon)在地图上表达专题信息十分常见leaflet中常使用L.marker添加图标L.icon,非常方便给定坐标将图标固定在地图中的某个位置,由于图标是有具体大小,并且大小固定不变,在缩放过程中有明显感觉随着地图比例尺缩小,图标会有一定的偏移这篇文章主要介绍使用L......
  • vue 实现自定义主题切换+日夜切换
    此处只参考修改主题色,日夜模式参考elep官网functiongradientColor(this:any,startColor:any,endColor:any,step:any){letstartRGB=gradientColor.prototype.colorRgb(startColor);//转换为rgb数组模式letstartR=startRGB[0];letstartG=star......
  • java 判断字符串内容是utf-8还是utf8mb4
    判断字符串内容是UTF-8还是UTF8MB4的方法概述在Java中,判断字符串内容是UTF-8还是UTF8MB4可以通过检查字符编码范围来实现。UTF-8使用1到4个字节表示一个字符,而UTF8MB4使用1到4个字节表示一个字符。下面将介绍整个流程和每一步需要做的事情。流程步骤描述1.将字符串转......
  • java 判断以逗号分割的字符串
    Java判断以逗号分割的字符串简介在Java中,判断以逗号分割的字符串可以使用split方法将字符串分割成多个子字符串,然后逐个判断每个子字符串是否满足特定条件。本文将介绍如何使用Java实现这一功能。流程图步骤描述步骤1通过split方法将字符串分割成多个子字符串步......
  • java 判断一个对象中是否存在重复的字段
    Java判断一个对象中是否存在重复的字段1.流程以下是判断一个对象中是否存在重复字段的流程:步骤描述1获取对象的所有字段2遍历字段,将字段名存入一个集合3判断集合的大小与字段数是否相等,若不相等则存在重复字段2.代码实现下面是每个步骤所需要完成的代......
  • java 判断形状区域重叠
    Java判断形状区域重叠在计算机图形学和计算机视觉领域,判断两个形状区域是否重叠是一个常见的问题。在本文中,我们将介绍如何使用Java编程语言来判断两个形状区域是否发生重叠,以及如何实现这个功能的代码示例。什么是形状区域重叠?形状区域重叠是指两个形状区域在二维平面上发生......
  • java 判断手机号
    Java判断手机号的实现方法作为一名经验丰富的开发者,我将教会你如何使用Java来判断手机号。下面是整个实现的步骤和所需代码的详细说明。实现步骤步骤操作1获取用户输入的手机号2使用正则表达式验证手机号格式3判断手机号的长度4判断手机号的前缀是否正确......
  • java 判断时分
    Java判断时分Java是一种广泛使用的编程语言,它提供了丰富的API和工具,可以用于开发各种类型的应用程序。在Java中,我们可以使用日期和时间类来处理日期和时间的相关操作。本文将介绍如何使用Java来判断给定时间的小时和分钟。获取当前时间在Java中,我们可以使用java.util.Date类来获......
  • java8 自定义函数编程
    Java8自定义函数编程在传统的Java编程中,我们通常使用面向对象的方式来组织代码。然而,在某些场景下,面向对象的方式并不是最合适的选择。Java8引入了函数式编程的概念,提供了一些新的特性,例如Lambda表达式和函数接口,使得我们可以更方便地进行函数式编程。Lambda表达式Lambda表达......
  • java设置excel自定义列宽
    Java设置Excel自定义列宽在Java中,我们经常需要操作Excel文件。Excel文件的列宽度对于数据的展示非常重要。默认情况下,Excel中的列宽度是根据内容自动调整的,但有时我们需要手动设置列宽度来确保数据的可读性和美观性。本文将介绍如何使用Java程序来设置Excel文件的自定义列宽。使......