需要在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. 使用pycharm搜索框和正则表达式匹配内容

    使用pycharm搜索框和正则表达式匹配内容原创薯饼__ 最后发布于2019-03-04 19:28:53 阅读数 660 收藏展开有时候我们要在爬虫网站中匹配各种各样的文本块,以获取需要的信息,每一 ...

  2. JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写:   [HttpPost]   public JsonResult QueryFeature(string u ...

  3. Pycharm操作数据库

    Pymysql 用于连接mysql数据库 连接数据库 data_ip = "192.168.34.128" data_name = "lch" data_pwd ...

  4. 3ds Max File Format (Part 3: The department of redundancy department; Config)

    Now we'll have a look at the Config stream. It begins like follows, and goes on forever with various ...

  5. 在docker上部署centos

    1.查找镜像源$ docker search centosNAME DESCRIPTION STARS OFFICIALcentos The official build of CentOS. 385 ...

  6. go语言 实现对称加密解密算法

    package main import ( "bytes" "crypto/aes" "crypto/cipher" "crypt ...

  7. 题解【AcWing274】移动服务

    题面 非常好的优化 \(\text{DP}\) 状态表示的题目. 首先可以设 \(dp_{i,x,y,z}\) 表示已经做完了前 \(i\) 个请求,现在的 \(3\) 名服务员分别在 \(x\) . ...

  8. C++——程序的结构

    1.作用域和可见性 1.1 函数原型中的参数其作用域仅在()内.因此参数名称可有可无,但是参数类型需要声明. 1.2 块作用域 在块中声明的标识符其作用域自声明处起,限于块中. 1.3 类作用域 类作 ...

  9. war文件—Web项目部署

    war文件是什么? Web存档(war)文件包含Web应用程序的所有内容.它减少了传输文件所需要的时间.  war文件的优点 节省时间:war文件将所有文件合并为一个单位. 所以在将文件从客户端传输到 ...

  10. 基于PO和单例设计模式用python+selenium进行ui自动化框架设计

    一)框架目录的结构 二)config包当中的config.ini文件主要是用来存项目的绝对路径,是为了后续跑用例和生成测试报告做准备然后目前的配置文件大都会用yaml,ini,excel,还有.py也 ...