需要在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# 对象对比是否相等 工作笔记的更多相关文章

  1. 2016年第2周读书笔记与工作笔记 scrollIntoView()与datalist元素

    这一周主要是看了html5网页开发实例与javascript 高级程序设计,供以后翻阅查找.  html5网页开发实例第1章与第二章的2.1部分: 第1章内容: html5在w3c的发展史. 浏览器的 ...

  2. javascript - 工作笔记 (事件四)

    在javascript - 工作笔记 (事件绑定二)篇中,我将事件的方法做了简单的包装,  JavaScript Code  12345   yx.bind(item, "click&quo ...

  3. 工作笔记3.手把手教你搭建SSH(struts2+hibernate+spring)环境

    上文中我们介绍<工作笔记2.软件开发经常使用工具> 从今天開始本文将教大家怎样进行开发?本文以搭建SSH(struts2+hibernate+spring)框架为例,共分为3步: 1)3个 ...

  4. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  5. 关于Java 中Integer 和Long对象 对比的陷阱(简单却容易犯的错误)

    彩票客户端“忘记密码”功能有bug,今天调试时,发现了原因: 功能模块中有一段: if(userpo.getId()!=Long.valueOf(uid)){ throw new VerifyExce ...

  6. Sencha Touch2 工作笔记

    Sencha Touch2 工作笔记 Ext.dataview.List activate( this, newActiveItem, oldActiveItem, eOpts ) Fires whe ...

  7. 工作笔记5.JAVA图片验证码

    本文主要内容为:利用JAVA图片制作验证码. 设计思路: 1.拷贝AuthImageServlet.class图片验证码 2.配置web.xml 3.JSP中,调用封装好的AuthImageServl ...

  8. 读书笔记——《MySQL DBA 工作笔记》

    关于前言 作者在前言中提出的一些观点很具有参考价值, 梳理完整的知识体系 这是每一个技术流都应该追逐的,完整的知识体系能够使我们对知识的掌握更加全面,而不仅仅局限于点 建立技术连接的思维,面对需求,永 ...

  9. 《工作笔记:移动web页面前端开发总结》

    工作笔记:移动web页面前端开发总结 移动web在当今的发展速度是一日千里,作为移动领域的门外汉,在这段时间的接触后,发现前端开发这一块做一个小小的总结. 1.四大浏览器内核 1.Trident (I ...

随机推荐

  1. Python 类方法、实例方法、静态方法的使用与及实例

    类方法 使用装饰器@classmethod 第一个参数必须是当前类对象,该参数名一般约定为“cls” (可修改但不建议)通过他来传递类的属性和方法(不能传实例的属性和方法) 调用:实例对象和类对象多可 ...

  2. linux - 查看是否安装 apache 以及 apache 版本

    命令 apachectl -v httpd -v 备注:这两个命令的作用一样 结果

  3. ZJOI2006 书架 lg2596

    题面见https://www.luogu.org/problemnew/show/P2596 题面就是描述了一个书柜从上到下放着书,可以看作一个序列,每个数的序号为它在从上向下数第几本 一开始建树偷了 ...

  4. 移动端调试神器vConsole

    vConsole.js 其实就是重写console方法,实现了类似于微信小程序的移动端调试效果 在普通html文件里使用 <script src="https://cdn.bootcs ...

  5. eureka server 单节点与多节点部署演示

    环境搭建 目录结构(ad-eureka为子模块) --ad-spring-cloud --ad-eureka --pom.xml --pom.xml 主pom.xml <?xml version ...

  6. python中一些相似用法的区别:index()和find(),dict[]和get()

    index和find在字符串中的区别: index()方法和find()方法相似,唯一的区别就是find方法不包含索引值会返回-1,而index()不包含索引值会抛出异常   同样的:获取字典dict ...

  7. 题解【AcWing176】装满的油箱

    题面 一开始拿到这个问题并不好做,于是考虑拆点. 考虑将一个点拆成 \(c+1\) 个,每个点表示(编号,剩余油量). 然后 \(\text{Dijkstra}\) 最短路即可. 每次跑 \(\tex ...

  8. paper: VG -- re-read

    重点:  1.The constructed graph inherits several properties of the series in its structure. periodic se ...

  9. ORA-00904: "I_LEVEL": invalid identifier

    问题描述 ORA-00904: "I_LEVEL": invalid identifier 标示符无效

  10. ms2

    # 准备: robots UA 池 图片懒加载 cookie IP ajax js 加密(js逆向 字体加密/大众点评/ base64 md5 AES python复写 要不就是第三方库执行js代码) ...