需要在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(1,1), new Point(1, 2), new Point(1, 3), new Point(1, 4), new Point(1, 5), new Point(1, 6)};var result1 = list1.Where(M => M == new Point(1, 3));

用另外三种对比方法均不能,如下
Point p1 = new Point(2, 1);Point p2 = new Point(2, 1);Console.WriteLine(p1 == p2);//FalseConsole.WriteLine(p1.Equals(p2));//False// ReferenceEquals 方法用于对象的引用是否相等// ReferenceEquals 不能重写 注意Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//Falsep1 = 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(2, 1);Point p2 = new Point(2, 1);Console.WriteLine(p1 == p2);//FalseConsole.WriteLine(p1.Equals(p2));//False// ReferenceEquals 方法用于对象的引用是否相等// ReferenceEquals 不能重写 注意Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//Falsep1 = p2;Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//TrueTestPoint p3 = new TestPoint(2, 1);TestPoint p4 = new TestPoint(2, 1);Console.WriteLine(p3 == p4);//TrueConsole.WriteLine(p3.Equals(p4));//True// ReferenceEquals 方法用于对象的引用是否相等// ReferenceEquals 不能重写 注意Console.WriteLine(System.Object.ReferenceEquals(p3, p4));//Falsep3 = p4;Console.WriteLine(System.Object.ReferenceEquals(p3, p4));//TrueList<Point> list1 = new List<Point>() { new Point(1,1), new Point(1, 2), new Point(1, 3), new Point(1, 4), new Point(1, 5), new Point(1, 6)};var result1 = list1.Where(M => M == new Point(1, 3));List<TestPoint> list2 = new List<TestPoint>() { new TestPoint(1, 1), new TestPoint(1, 2), new TestPoint(1, 3), new TestPoint(1, 4), new TestPoint(1, 5), new TestPoint(1, 6) };var result2 = list2.Where(M => M == new TestPoint(1, 3));
完整代码如下:
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(2, 1);Point p2 = new Point(2, 1);Console.WriteLine(p1 == p2);//FalseConsole.WriteLine(p1.Equals(p2));//False// ReferenceEquals 方法用于对象的引用是否相等// ReferenceEquals 不能重写 注意Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//Falsep1 = p2;Console.WriteLine(System.Object.ReferenceEquals(p1, p2));//TrueTestPoint p3 = new TestPoint(2, 1);TestPoint p4 = new TestPoint(2, 1);Console.WriteLine(p3 == p4);//TrueConsole.WriteLine(p3.Equals(p4));//True// ReferenceEquals 方法用于对象的引用是否相等// ReferenceEquals 不能重写 注意Console.WriteLine(System.Object.ReferenceEquals(p3, p4));//Falsep3 = p4;Console.WriteLine(System.Object.ReferenceEquals(p3, p4));//TrueList<Point> list1 = new List<Point>() { new Point(1,1), new Point(1, 2), new Point(1, 3), new Point(1, 4), new Point(1, 5), new Point(1, 6)};var result1 = list1.Where(M => M == new Point(1, 3));List<TestPoint> list2 = new List<TestPoint>() { new TestPoint(1, 1), new TestPoint(1, 2), new TestPoint(1, 3), new TestPoint(1, 4), new TestPoint(1, 5), new TestPoint(1, 6) };var result2 = list2.Where(M => M == new TestPoint(1, 3));Console.Read();}}}
ReferenceEquals 不能重写 注意。
注意:这里的对象是引用类对象。