比较一个类的两个实例

我有这样的课

public class TestData { public string Name {get;set;} public string type {get;set;} public List Members = new List(); public void AddMembers(string[] members) { Members.AddRange(members); } } 

我想知道是否有可能直接与这个类的实例进行比较,并发现它们完全相同? 机制是什么? 我正在寻找类似if(testData1 == testData2) //Do Something如果没有,怎么做?

您应该在类上实现IEquatable接口,这将允许您定义相等逻辑。 实际上,您也应该覆盖Equals方法。

 public class TestData : IEquatable { public string Name {get;set;} public string type {get;set;} public List Members = new List(); public void AddMembers(string[] members) { Members.AddRange(members); } // Overriding Equals member method, which will call the IEquatable implementation // if appropriate. public override bool Equals( Object obj ) { var other = obj as TestData; if( other == null ) return false; return Equals (other); } public override int GetHashcode() { // Provide own implementation } // This is the method that must be implemented to conform to the // IEquatable contract public bool Equals( TestData other ) { if( other == null ) { return false; } if( ReferenceEquals (this, other) ) { return true; } // You can also use a specific StringComparer instead of EqualityComparer // Check out the specific implementations (StringComparer.CurrentCulture, ea). if( EqualityComparer.Default.Compare (Name, other.Name) == false ) { return false; } ... // To compare the members array, you could perhaps use the // [SequenceEquals][2] method. But, be aware that [] {"a", "b"} will not // be considerd equal as [] {"b", "a"} return true; } } 

有三种方法可以将某些参考类型T对象相互比较:

  1. object.Equals方法
  2. 使用IEquatable.Equals (仅适用于实现IEquatable类型)
  3. 使用比较运算符==

此外,每种情况都有两种可能性:

  1. 被比较对象的静态类型是T (或T其他一些基础)
  2. 被比较的object的静态类型是object

您绝对需要知道的规则是:

  • Equalsoperator==的默认值是测试引用相等性
  • 无论所比较的对象的静态类型是什么, Equals实现都将正常工作
  • IEquatable.Equals应始终与IEquatable.Equals相同,但如果对象的静态类型为T ,它将提供稍好的性能

那么所有这些在实践中意味着什么呢?

根据经验,您应该使用Equals来检查相等性(根据需要覆盖IEquatable )并实现IEquatable以提供稍微更好的性能。 在这种情况下, IEquatable.Equals应该以IEquatable.Equals

对于某些特定类型(例如System.String ),使用operator==也是可以接受的,尽管你必须小心不要进行“多态比较”。 另一方面,即使您进行了这样的比较, Equals方法也能正常工作。

您可以看到多态比较的示例以及为什么它可能成为问题。

最后,永远不要忘记,如果覆盖object.GetHashCode ,您还必须相应地覆盖object.GetHashCode

一种方法是实现IEquatable

 public class TestData : IEquatable { public string Name {get;set;} public string type {get;set;} public List Members = new List(); public void AddMembers(string[] members) { Members.AddRange(members); } public bool Equals(TestData other) { if (this.Name != other.Name) return false; if (this.type != other.type) return false; // TODO: Compare Members and return false if not the same return true; } } if (testData1.Equals(testData2)) // classes are the same 

你也可以只重写Equals(object)方法(来自System.Object),如果你这样做,你也应该覆盖GetHashCode, 请看这里

您可以覆盖equals方法,并在其中手动比较对象

另请参阅重载等于()和运算符==的指南

您需要定义使对象A等于对象B的规则,然后覆盖此类型的Equals运算符。

http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

首先,很难定义平等,只有你可以定义平等对你来说意味着什么

  1. 这是否意味着会员具有相同的价值
  2. 或者他们指向相同的位置。

这是一个讨论和答案

什么是比较参考类型的两个实例的“最佳实践”?

实现IEquatable interface 。 这定义了一个通用方法,值类型或类实现该方法以创建特定于类型的方法来确定实例的相等性。 更多信息:

http://msdn.microsoft.com/en-us/library/ms131187.aspx

我在这里看到很多好的答案,但万一你希望比较工作如下

 if(testData1 == testData2) // DoSomething 

而不是使用Equals函数,您可以覆盖==和!=运算符:

 public static bool operator == (TestData left, TestData right) { bool comparison = true; //Make the desired comparison return comparison; } public static bool operator != (TestData left, TestData right) { return !(left == right); }