I have a class like this
public class TestData
{
public string Name {get;set;}
public string type {get;set;}
public List Members = ne
Implement the IEquatable<T> interface
. This defines a generalized method that a value type or class implements to create a type-specific method for determining equality of instances. More information here:
http://msdn.microsoft.com/en-us/library/ms131187.aspx
You can override the equals method and inside it manually compare the objects
Also take a look at Guidelines for Overloading Equals() and Operator ==
One way of doing it is to implement IEquatable<T>
public class TestData : IEquatable<TestData>
{
public string Name {get;set;}
public string type {get;set;}
public List<string> Members = new List<string>();
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
You can also just override the Equals(object) method (from System.Object), if you do this you should also override GetHashCode see here
There are three ways objects of some reference type T
can be compared to each other:
IEquatable<T>.Equals
(only for types that implement IEquatable<T>
)==
Furthermore, there are two possibilities for each of these cases:
T
(or some other base of T
)object
The rules you absolutely need to know are:
Equals
and operator==
is to test for reference equalityEquals
will work correctly no matter what the static type of the objects being compared isIEquatable<T>.Equals
should always behave the same as object.Equals
, but if the static type of the objects is T
it will offer slightly better performanceSo what does all of this mean in practice?
As a rule of thumb you should use Equals
to check for equality (overriding object.Equals
as necessary) and implement IEquatable<T>
as well to provide slightly better performance. In this case object.Equals
should be implemented in terms of IEquatable<T>.Equals
.
For some specific types (such as System.String
) it's also acceptable to use operator==
, although you have to be careful not to make "polymorphic comparisons". The Equals
methods, on the other hand, will work correctly even if you do make such comparisons.
You can see an example of polymorphic comparison and why it can be a problem here.
Finally, never forget that if you override object.Equals
you must also override object.GetHashCode
accordingly.
You will need to define the rules that make object A equal to object B and then override the Equals operator for this type.
http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx
I see many good answers here but just in case you want the comparison to work like
if(testData1 == testData2) // DoSomething
instead of using Equals function you can override == and != operators:
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);
}