C# 对象对比是否相等 工作笔记
需要在Linq 中对比两个对象是否相等
- /// <summary>
- /// 定义一个点
- /// </summary>
- class Point
- {
- public int x { get; set; }
- public int y { get; set; }
- public Point(int x, int y)
- {
- this.x = x;
- this.y = y;
- }
- }
- List<Point> list1 = new List<Point>() { new Point(,), new Point(, ), new Point(, ), new Point(, ), new Point(, ), new Point(, )};
- var result1 = list1.Where(M => M == new Point(, ));
三种对比方法均不能
- Point p1 = new Point(, );
- Point p2 = new Point(, );
- Console.WriteLine(p1 == p2);//False
- Console.WriteLine(p1.Equals(p2));//False
- // ReferenceEquals 方法用于对象的引用是否相等
- // ReferenceEquals 不能重写 注意
- Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//False
- p1 = p2;
- Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//True
由于没有重写 == 运算符 和 Equals 方法,不能够 直接使用否则对比的将是对象的引用地址
需要对类进行重写,详细如下
- /// <summary>
- /// 定义一个点,并重写对象与对象是否相等的方法
- /// 可用于判断对象是否相等
- /// eg:
- /// obj1 == obj2
- /// obj1.Equals(obj2)
- /// </summary>
- class TestPoint : IEquatable<TestPoint>
- {
- public int x { get; set; }
- public int y { get; set; }
- public TestPoint(int x, int y)
- {
- this.x = x;
- this.y = y;
- }
- /// <summary>
- /// 重载 == 运算符
- /// </summary>
- /// <param name="p1"></param>
- /// <param name="p2"></param>
- /// <returns></returns>
- public static bool operator ==(TestPoint p1, TestPoint p2)
- {
- return (p1.x == p2.x) && (p1.y == p2.y);
- }
- /// <summary>
- /// 重载 != 运算符
- /// </summary>
- /// <param name="p1"></param>
- /// <param name="p2"></param>
- /// <returns></returns>
- public static bool operator !=(TestPoint p1, TestPoint p2)
- {
- return (p1.x != p2.x) || (p1.y != p2.y);
- }
- /// <summary>
- /// 重写Equals(object obj)
- /// </summary>
- /// <param name="obj"></param>
- /// <returns></returns>
- public override bool Equals(object obj)
- {
- return this.Equals(obj as TestPoint);
- }
- /// <summary>
- /// 重写 计算对象的哈希值方法(自定义 这里只是示范)
/// 该方法用于判断对象的哈希值是否相等 如对象哈希值相同 就认为两个对象 相等- /// </summary>
- /// <returns></returns>
- public override int GetHashCode()
- {
- return this.x.GetHashCode() + this.y.GetHashCode();
- }
- /// <summary>
- /// 继承定义Equals<T>方法
- /// 需要继承接口IEquatable<T>
- /// </summary>
- /// <param name="other"></param>
- /// <returns></returns>
- public bool Equals(TestPoint other)
- {
- return (this.x == other.x) && (this.y == other.y);
- }
- }
使用大概示范
- Point p1 = new Point(, );
- Point p2 = new Point(, );
- Console.WriteLine(p1 == p2);//False
- Console.WriteLine(p1.Equals(p2));//False
- // ReferenceEquals 方法用于对象的引用是否相等
- // ReferenceEquals 不能重写 注意
- Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//False
- p1 = p2;
- Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//True
- TestPoint p3 = new TestPoint(, );
- TestPoint p4 = new TestPoint(, );
- Console.WriteLine(p3 == p4);//True
- Console.WriteLine(p3.Equals(p4));//True
- // ReferenceEquals 方法用于对象的引用是否相等
- // ReferenceEquals 不能重写 注意
- Console.WriteLine(System.Object.ReferenceEquals(p3, p4));//False
- p3 = p4;
- Console.WriteLine(System.Object.ReferenceEquals(p3, p4));//True
- List<Point> list1 = new List<Point>() { new Point(,), new Point(, ), new Point(, ), new Point(, ), new Point(, ), new Point(, )};
- var result1 = list1.Where(M => M == new Point(, ));
- List<TestPoint> list2 = new List<TestPoint>() { new TestPoint(, ), new TestPoint(, ), new TestPoint(, ), new TestPoint(, ), new TestPoint(, ), new TestPoint(, ) };
- var result2 = list2.Where(M => M == new TestPoint(, ));
完整代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApplication1
- {
- /// <summary>
- /// 定义一个点
- /// </summary>
- class Point
- {
- public int x { get; set; }
- public int y { get; set; }
- public Point(int x, int y)
- {
- this.x = x;
- this.y = y;
- }
- }
- /// <summary>
- /// 定义一个点,并重写对象与对象是否相等的方法
- /// 可用于判断对象是否相等
- /// eg:
- /// obj1 == obj2
- /// obj1.Equals(obj2)
- /// </summary>
- class TestPoint : IEquatable<TestPoint>
- {
- public int x { get; set; }
- public int y { get; set; }
- public TestPoint(int x, int y)
- {
- this.x = x;
- this.y = y;
- }
- /// <summary>
- /// 重载 == 运算符
- /// </summary>
- /// <param name="p1"></param>
- /// <param name="p2"></param>
- /// <returns></returns>
- public static bool operator ==(TestPoint p1, TestPoint p2)
- {
- return (p1.x == p2.x) && (p1.y == p2.y);
- }
- /// <summary>
- /// 重载 != 运算符
- /// </summary>
- /// <param name="p1"></param>
- /// <param name="p2"></param>
- /// <returns></returns>
- public static bool operator !=(TestPoint p1, TestPoint p2)
- {
- return (p1.x != p2.x) || (p1.y != p2.y);
- }
- /// <summary>
- /// 重写Equals(object obj)
- /// </summary>
- /// <param name="obj"></param>
- /// <returns></returns>
- public override bool Equals(object obj)
- {
- return this.Equals(obj as TestPoint);
- }
- /// <summary>
- /// 重写 计算对象的哈希值方法(自定义 这里只是示范)
- /// </summary>
- /// <returns></returns>
- public override int GetHashCode()
- {
- return this.x.GetHashCode() + this.y.GetHashCode();
- }
- /// <summary>
- /// 继承定义Equals<T>方法
- /// 需要继承接口IEquatable<T>
- /// </summary>
- /// <param name="other"></param>
- /// <returns></returns>
- public bool Equals(TestPoint other)
- {
- return (this.x == other.x) && (this.y == other.y);
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Point p1 = new Point(, );
- Point p2 = new Point(, );
- Console.WriteLine(p1 == p2);//False
- Console.WriteLine(p1.Equals(p2));//False
- // ReferenceEquals 方法用于对象的引用是否相等
- // ReferenceEquals 不能重写 注意
- Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//False
- p1 = p2;
- Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//True
- TestPoint p3 = new TestPoint(, );
- TestPoint p4 = new TestPoint(, );
- Console.WriteLine(p3 == p4);//True
- Console.WriteLine(p3.Equals(p4));//True
- // ReferenceEquals 方法用于对象的引用是否相等
- // ReferenceEquals 不能重写 注意
- Console.WriteLine(System.Object.ReferenceEquals(p3, p4));//False
- p3 = p4;
- Console.WriteLine(System.Object.ReferenceEquals(p3, p4));//True
- List<Point> list1 = new List<Point>() { new Point(,), new Point(, ), new Point(, ), new Point(, ), new Point(, ), new Point(, )};
- var result1 = list1.Where(M => M == new Point(, ));
- List<TestPoint> list2 = new List<TestPoint>() { new TestPoint(, ), new TestPoint(, ), new TestPoint(, ), new TestPoint(, ), new TestPoint(, ), new TestPoint(, ) };
- var result2 = list2.Where(M => M == new TestPoint(, ));
- Console.Read();
- }
- }
- }
ReferenceEquals 不能重写 注意
用于工作记录
2018年12月7日13:22:13
lxp
C# 对象对比是否相等 工作笔记的更多相关文章
- 2016年第2周读书笔记与工作笔记 scrollIntoView()与datalist元素
这一周主要是看了html5网页开发实例与javascript 高级程序设计,供以后翻阅查找. html5网页开发实例第1章与第二章的2.1部分: 第1章内容: html5在w3c的发展史. 浏览器的 ...
- javascript - 工作笔记 (事件四)
在javascript - 工作笔记 (事件绑定二)篇中,我将事件的方法做了简单的包装, JavaScript Code 12345 yx.bind(item, "click&quo ...
- 工作笔记3.手把手教你搭建SSH(struts2+hibernate+spring)环境
上文中我们介绍<工作笔记2.软件开发经常使用工具> 从今天開始本文将教大家怎样进行开发?本文以搭建SSH(struts2+hibernate+spring)框架为例,共分为3步: 1)3个 ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- 关于Java 中Integer 和Long对象 对比的陷阱(简单却容易犯的错误)
彩票客户端“忘记密码”功能有bug,今天调试时,发现了原因: 功能模块中有一段: if(userpo.getId()!=Long.valueOf(uid)){ throw new VerifyExce ...
- Sencha Touch2 工作笔记
Sencha Touch2 工作笔记 Ext.dataview.List activate( this, newActiveItem, oldActiveItem, eOpts ) Fires whe ...
- 工作笔记5.JAVA图片验证码
本文主要内容为:利用JAVA图片制作验证码. 设计思路: 1.拷贝AuthImageServlet.class图片验证码 2.配置web.xml 3.JSP中,调用封装好的AuthImageServl ...
- 读书笔记——《MySQL DBA 工作笔记》
关于前言 作者在前言中提出的一些观点很具有参考价值, 梳理完整的知识体系 这是每一个技术流都应该追逐的,完整的知识体系能够使我们对知识的掌握更加全面,而不仅仅局限于点 建立技术连接的思维,面对需求,永 ...
- 《工作笔记:移动web页面前端开发总结》
工作笔记:移动web页面前端开发总结 移动web在当今的发展速度是一日千里,作为移动领域的门外汉,在这段时间的接触后,发现前端开发这一块做一个小小的总结. 1.四大浏览器内核 1.Trident (I ...
随机推荐
- Linux - mysql 异常:登录不上mysql数据库
问题描述 重启虚拟机之后,用命令 mysql -u root -p 登录不上 mysql 数据库,页面显示: 但是,用命令 service mysqld status 可以查看状态 解决方案 1.查看 ...
- C# asp.net 配置文件连接sql 数据库
先引用 using System.Configuration;//配置文件using System.Data.SqlClient; 我这里使用的是SqlServer 2008 sa 用户 密码也为s ...
- 巨杉内核笔记(一)| SequoiaDB 会话(session)简介
SequoiaDB 会话(session)简介 会话(Session)的基本概念 容易弄混淆的两个概念是会话与连接. 通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文( ...
- 如何面试QA(面试官角度)
面试是一对一 或者多对一的沟通,是和候选人 互相交换信息.平等的. 面试的目标是选择和雇佣最适合的人选.是为了完成组织目标.协助人力判断候选人是否合适空缺职位. 面试类型: (1)预判面试(查看简历后 ...
- NotePad++中如何改变光标样式(转换横着和竖着)?
在键盘上找 Insert ,按这个Insert就可以把横向闪烁光标( _ )修改成竖向闪烁光标样式( | )
- C++——类与对象
1.抽象: 是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程. 1.1 先注意问题的本质描述,其次是实现过程和细节: 1.2 数据抽象:描述某类对象的属性或状态(对象相互区别的物 ...
- python使用临时文件
# 需求 # 某项目中,我们从传感器中采集数据,没采集1G数据后,做数据分析,最终只保存分析结果 # 这样很大的临时文件如果常驻在内存,将消耗大量地内存资源,我们可以使用临时文件储存(外部储存) # ...
- Markdown进阶教程
Markdown是很好用的轻量级标记语言,许多开发人员喜欢使用Markdown来记录学习心得和写博客.本篇博客主要介绍Markdown的高级技巧教程,Markdown的基础教程已经在上篇介绍过了. ...
- C语言输入一个整数转化为字符串
将数字转化为对应的字符,可以通过n%10+48来实现,也可以通过n%10+'0'来实现,因为‘0’的ASCII码的数值就是48 因为字符串‘0’ 对应的10进制 整数是48 字符串'9'对应的10进制 ...
- python3练习100题——023
再做一道,把这周的任务搞定- 其实看到这道题,很熟悉,让我想起大一时被C语言支配的恐惧.那个时候不停的在push自己,给自己很大的压力.上C语言课的时候让人昏昏欲睡,但是还是逼迫自己打起精神来学习,一 ...