<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.netindonesia.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Norman Sasono : C#, System.Object, Equals</title><link>http://geeks.netindonesia.net/blogs/norman/archive/tags/C_2300_/System.Object/Equals/default.aspx</link><description>Tags: C#, System.Object, Equals</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>System.Object.Equals must be Reflexive, Symmetry and Transitive</title><link>http://geeks.netindonesia.net/blogs/norman/archive/2007/04/20/System.Object.Equals-must-be-Reflexive_2C00_-Symmetry-and-Transitive.aspx</link><pubDate>Fri, 20 Apr 2007 07:25:00 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:16464</guid><dc:creator>norman</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/norman/rsscomments.aspx?PostID=16464</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/norman/archive/2007/04/20/System.Object.Equals-must-be-Reflexive_2C00_-Symmetry-and-Transitive.aspx#comments</comments><description>&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;You just override &lt;strong&gt;System.Object.Equals&lt;/strong&gt;, or create some other method to check &lt;strong&gt;whether member-wise-values of two objects are the same&lt;/strong&gt;, how would you ensure your implementation of &lt;strong&gt;equivalent&lt;/strong&gt; in the method is correct? You should go back to mathematical definition of &lt;strong&gt;Equivalence Relation&lt;/strong&gt;. You should do some kind of formal methods. I&amp;rsquo;ll bring back your memory on what Equivalence Relation is and show you simple code to test your equivalent relation implementation.&lt;/font&gt;&lt;/p&gt;&lt;h2 style="margin:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" face="Cambria" size="4"&gt;Distinguishing objects by Equivalence&lt;/font&gt;&lt;/h2&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;Just now, a friend of mine asked how to compare the values (values of members) of two different instances of the same .NET class (class means reference type). In other words, he wants to know how to compare the two instances of a reference type as if they are value type. &lt;span&gt;&amp;nbsp;&lt;/span&gt;He just wants to compare their values. He has tried the &amp;ldquo;Equals&amp;rdquo; method, but it always returns &amp;ldquo;False&amp;rdquo; whenever he give two instances with the same values. What happened?&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;In .NET, objects can be distinguished by Identity and by Equivalence. To distinguish by identity, you use the static method &lt;strong&gt;System.Object.ReferenceEquals&lt;/strong&gt;. This method will compare the &lt;strong&gt;address&lt;/strong&gt; of two object references, doesn&amp;rsquo;t care what the type is. This method will return true if the two references actually refer to the exactly same object. &lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;While to distinguish by equivalence, you use &lt;strong&gt;System.Object.Equals&lt;/strong&gt;. &lt;span&gt;&amp;nbsp;&lt;/span&gt;For value type (such as struct), as identity means nothing, this method simply compare two objects by member-wise comparison. But for reference type, it will also compare the identity! That&amp;rsquo;s why my friends always got &amp;ldquo;False&amp;rdquo; whenever he passes two instances of a reference type that member-wise values are the same.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;So, he cannot use System.Object.Equals but he must override this method to check the member values one by one. Actually, this check can be done outside of the class, but it results ugly code. You may have this &amp;ldquo;check code&amp;rdquo; all over the place. So, put this responsibility in your class would be more elegant. If you don&amp;rsquo;t want to override System.Object.Equals, and prefer to make another method let say named &amp;ldquo;IsEqual&amp;rdquo; is up to you. &lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;The operations to check equivalence is up to you. It depends on your business logic/domain problems. You may want to compare all member values or whatever. Here I only interest on how you would ensure the equivalent implementation you make is correct, that is meet the mathematical definition of &lt;strong&gt;Equivalence Relation&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;Note that if you&amp;rsquo;re overriding System.Object.Equals you should override&lt;strong&gt; System.Object.GetHashCode&lt;/strong&gt;. Again, I&amp;rsquo;m not going to talk about it either.&lt;/font&gt;&lt;/p&gt;&lt;h2 style="margin:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" face="Cambria" size="4"&gt;Equivalence Relation&lt;/font&gt;&lt;/h2&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Equivalence Relation is defined as Relation that is &lt;strong&gt;Reflexive&lt;/strong&gt;, &lt;strong&gt;Symmetric&lt;/strong&gt; and &lt;strong&gt;Transitive&lt;/strong&gt;. &lt;/font&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span&gt;J&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri"&gt; What? &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;Well, just move on reading&amp;hellip; &lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;Let say we have a non empty set &lt;strong&gt;S&lt;/strong&gt;. A relation &lt;strong&gt;R&lt;/strong&gt; on &lt;strong&gt;S&lt;/strong&gt; &lt;u&gt;is an equivalent relation&lt;/u&gt; if:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;text-align:justify;"&gt;&lt;span&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;For every &lt;strong&gt;a&lt;/strong&gt; member &lt;strong&gt;S&lt;/strong&gt;, &lt;strong&gt;aRa&lt;/strong&gt; (Reflexive).&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;text-align:justify;"&gt;&lt;span&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;For &lt;strong&gt;a&lt;/strong&gt; and &lt;strong&gt;b&lt;/strong&gt; both members of &lt;strong&gt;S&lt;/strong&gt;, if &lt;strong&gt;aRb&lt;/strong&gt;, then &lt;strong&gt;bRa&lt;/strong&gt; (Symmetric).&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 0.5in;text-indent:-0.25in;text-align:justify;"&gt;&lt;span&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;3.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;For &lt;strong&gt;a&lt;/strong&gt;, &lt;strong&gt;b&lt;/strong&gt; and &lt;strong&gt;c&lt;/strong&gt; are members of S, if &lt;strong&gt;aRb&lt;/strong&gt; and &lt;strong&gt;bRc&lt;/strong&gt;, then &lt;strong&gt;aRc&lt;/strong&gt; (Transitive).&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;In short, equivalence relation is classification of objects which they are in some way &amp;ldquo;alike&amp;rdquo;.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;Here&amp;rsquo;s some examples to give you a better understanding:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;text-align:justify;"&gt;&lt;span&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;1.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&amp;ldquo;=&amp;rdquo;, yes the old &amp;ldquo;sama dengan&amp;rdquo;&amp;nbsp;that you learn since you&amp;rsquo;re a kid. &lt;/font&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span&gt;J&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-align:justify;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;strong&gt;a&lt;/strong&gt;=&lt;strong&gt;a&lt;/strong&gt; for every &lt;strong&gt;a&lt;/strong&gt; member &lt;strong&gt;S&lt;/strong&gt;. (Reflexive)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;If &lt;strong&gt;a&lt;/strong&gt;=&lt;strong&gt;b&lt;/strong&gt;, then &lt;strong&gt;b&lt;/strong&gt;=&lt;strong&gt;a&lt;/strong&gt;. &lt;span&gt;&amp;nbsp;&lt;/span&gt;(Symmetric)&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;If &lt;strong&gt;a&lt;/strong&gt;=&lt;strong&gt;b&lt;/strong&gt; and &lt;strong&gt;b&lt;/strong&gt;=&lt;strong&gt;c&lt;/strong&gt; then &lt;strong&gt;a&lt;/strong&gt;=&lt;strong&gt;c&lt;/strong&gt;. (Transitive)&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;So, &amp;quot;=&amp;quot; is an equivalence relation.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;text-align:justify;"&gt;&lt;span&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;2.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;&amp;ldquo;Is the same species as&amp;rdquo; in the classification of animals by species is also an equivalent relation in the set of animals.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-indent:-0.25in;text-align:justify;"&gt;&lt;span&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;3.&lt;/font&gt;&lt;span style="font:7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;&amp;ldquo;subset&amp;rdquo;. &amp;ldquo;subset&amp;rdquo; is reflexive and transitive. But not symmetric. So, &amp;ldquo;subset&amp;rdquo; relation is NOT an equivalent relation.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-align:justify;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;strong&gt;a&lt;/strong&gt; is subset of &lt;strong&gt;a&lt;/strong&gt; (reflexive). &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle" style="margin:0in 0in 0pt 0.5in;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;If &lt;strong&gt;a&lt;/strong&gt; is subset of &lt;strong&gt;b&lt;/strong&gt;, and &lt;strong&gt;b&lt;/strong&gt; is subset of &lt;strong&gt;c&lt;/strong&gt;, then &lt;strong&gt;a&lt;/strong&gt; subset of &lt;strong&gt;c&lt;/strong&gt;. (Transitive)&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast" style="margin:0in 0in 10pt 0.5in;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;if &lt;strong&gt;a&lt;/strong&gt; is subset of &lt;strong&gt;b&lt;/strong&gt; &lt;strong&gt;&lt;u&gt;does not imply&lt;/u&gt;&lt;/strong&gt; &lt;strong&gt;b&lt;/strong&gt; is subset of &lt;strong&gt;a&lt;/strong&gt;. (NOT symmetric)&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;So, got the point what &amp;ldquo;equivalence&amp;rdquo; means? In the above example, the &amp;ldquo;subset&amp;rdquo; relation does not meet the property to be recognized as an Equivalence Relation.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;Now, we&amp;rsquo;d like to see whether &amp;ldquo;Equals&amp;rdquo; method that you make are Reflexive, Symmetry and Transitive. Let&amp;rsquo;s see the code. &lt;/font&gt;&lt;/p&gt;&lt;h2 style="margin:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" face="Cambria" size="4"&gt;The Code&lt;/font&gt;&lt;/h2&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Let say I have a class as follow:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; MyMember;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; MyOtherMember;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; AnotherOneMember;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; Equals(&lt;span style="color:blue;"&gt;object&lt;/span&gt; obj)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt; mc = (&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;)obj;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.MyMember == mc.MyMember &amp;amp;&amp;amp;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.MyOtherMember == mc.MyOtherMember &amp;amp;&amp;amp;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.AnotherOneMember == mc.AnotherOneMember;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetHashCode()&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;base&lt;/span&gt;.GetHashCode();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Here I override the System.Object.Equals method. I simply compare the value of each member of the two objects. You may define your own operations within the method depends on your domain problem. But your implementation of &amp;ldquo;equals&amp;rdquo; should pass this test:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;class&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt; mc1 = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mc1.MyMember = &lt;span style="color:#a31515;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mc1.MyOtherMember = &lt;span style="color:#a31515;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mc1.AnotherOneMember = 1;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt; mcsatu = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mcsatu.MyMember = &lt;span style="color:#a31515;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mcsatu.MyOtherMember = &lt;span style="color:#a31515;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mcsatu.AnotherOneMember = 1;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt; mcone = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyClass&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mcone.MyMember = &lt;span style="color:#a31515;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mcone.MyOtherMember = &lt;span style="color:#a31515;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;mcone.AnotherOneMember = 1;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EquivalentRelationChecker&lt;/span&gt; checker = &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt 1in;text-indent:0.5in;line-height:normal;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas;"&gt;new&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt; &lt;span style="color:#2b91af;"&gt;EquivalentRelationChecker&lt;/span&gt;(mc1, mcsatu, mcone);&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;checker.AssertEquivalentRelation();&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;Where &lt;/font&gt;&lt;span style="font-size:10pt;color:#2b91af;line-height:115%;font-family:Consolas;"&gt;EquivalentRelationChecker &lt;/span&gt;&lt;font face="Calibri" size="3"&gt;is this class below:&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;color:blue;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EquivalentRelationChecker&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;object&lt;/span&gt; o1, o2, o3;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; EquivalentRelationChecker(&lt;span style="color:blue;"&gt;object&lt;/span&gt; o1, &lt;span style="color:blue;"&gt;object&lt;/span&gt; o2, &lt;span style="color:blue;"&gt;object&lt;/span&gt; o3)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(o1!=&lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; o2!=&lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp; o3!=&lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.o1 = o1;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.o2 = o2;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;this&lt;/span&gt;.o3 = o3;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; AssertEquivalentRelation()&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssertReflexive();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssertSymmetric();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;AssertTransitive();&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; AssertReflexive()&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.Assert(o1.Equals(o1));&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; AssertSymmetric()&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(o1.Equals(o2))&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.Assert(o2.Equals(o1));&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; AssertTransitive()&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(o1.Equals(o2) &amp;amp;&amp;amp; o2.Equals(o3))&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;.Assert(o1.Equals(o3));&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0pt;line-height:normal;"&gt;&lt;span style="font-size:10pt;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Note the methods:&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:Consolas;"&gt;AssertReflexive, AssertSymmetric &lt;/span&gt;&lt;span&gt;&lt;font face="Calibri" size="3"&gt;and&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size:10pt;line-height:115%;font-family:Consolas;"&gt; AssertTransitive.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;text-align:justify;"&gt;&lt;font face="Calibri" size="3"&gt;You can use this class to check whether your implementation of &amp;ldquo;equals&amp;rdquo; fits the definition of Equivalence Relation.&lt;/font&gt;&lt;/p&gt;&lt;h2 style="margin:10pt 0in 0pt;"&gt;&lt;font color="#4f81bd" face="Cambria" size="4"&gt;The Rant&lt;/font&gt;&lt;/h2&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font face="Calibri" size="3"&gt;My implementation in overriding the Equals method is damn simple as it&amp;rsquo;s just a toy illustration. Yours might be more complex. But still &lt;strong&gt;any implementation of System.Object.Equals &lt;span&gt;&amp;nbsp;&lt;/span&gt;must be Reflexive, Symmetric and Transitive&lt;/strong&gt;. So you can test your implementation with the also simple &lt;/font&gt;&lt;span style="font-size:10pt;color:#2b91af;line-height:115%;font-family:Consolas;"&gt;EquivalentRelationChecker&lt;/span&gt;&lt;font face="Calibri" size="3"&gt; class above. The class might be simple, but the point here is you should really understand what equivalent means.&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;em&gt;&lt;font face="Calibri"&gt;Formal Methods in programming is important. So, don&amp;rsquo;t throw away your Mathematical knowledge &amp;amp; skill. Keep your mathematical maturity even if you&amp;rsquo;re now only an Enterprise Developer. &lt;/font&gt;&lt;/em&gt;&lt;em&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span&gt;J&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri"&gt; Ha..ha..ha..&lt;/font&gt;&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/norman/archive/2007/04/20/System.Object.Equals-must-be-Reflexive_2C00_-Symmetry-and-Transitive.aspx&amp;amp;subject=System.Object.Equals must be Reflexive, Symmetry and Transitive" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/norman/archive/2007/04/20/System.Object.Equals-must-be-Reflexive_2C00_-Symmetry-and-Transitive.aspx&amp;amp;t=System.Object.Equals+must+be+Reflexive%2c+Symmetry+and+Transitive" target="_blank" title="Submit System.Object.Equals must be Reflexive, Symmetry and Transitive to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/norman/archive/2007/04/20/System.Object.Equals-must-be-Reflexive_2C00_-Symmetry-and-Transitive.aspx&amp;amp;title=System.Object.Equals+must+be+Reflexive%2c+Symmetry+and+Transitive" target="_blank" title="Submit System.Object.Equals must be Reflexive, Symmetry and Transitive to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/norman/archive/2007/04/20/System.Object.Equals-must-be-Reflexive_2C00_-Symmetry-and-Transitive.aspx&amp;amp;phase=2" target="_blank" title="Submit System.Object.Equals must be Reflexive, Symmetry and Transitive to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/norman/archive/2007/04/20/System.Object.Equals-must-be-Reflexive_2C00_-Symmetry-and-Transitive.aspx&amp;amp;title=System.Object.Equals+must+be+Reflexive%2c+Symmetry+and+Transitive" target="_blank" title="Add System.Object.Equals must be Reflexive, Symmetry and Transitive to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=16464" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/norman/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.netindonesia.net/blogs/norman/archive/tags/Equals/default.aspx">Equals</category><category domain="http://geeks.netindonesia.net/blogs/norman/archive/tags/System.Object/default.aspx">System.Object</category></item></channel></rss>