Export (0) Print
Expand All

Tuple<T1, T2, T3>.IStructuralEquatable.Equals Method

Returns a value that indicates whether the current Tuple<T1, T2, T3> object is equal to a specified object based on a specified comparison method.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

bool IStructuralEquatable.Equals(
	Object other,
	IEqualityComparer comparer
)

Parameters

other
Type: System.Object

The object to compare with this instance.

comparer
Type: System.Collections.IEqualityComparer

An object that defines the method to use to evaluate whether the two objects are equal.

Return Value

Type: System.Boolean
true if the current instance is equal to the specified object; otherwise, false.

Implements

IStructuralEquatable.Equals(Object, IEqualityComparer)

This member is an explicit interface member implementation. It can be used only when the Tuple<T1, T2, T3> instance is cast to an IStructuralEquatable interface.

The IEqualityComparer.Equals implementation is called only if other is not null, and if it can be successfully cast (in C#) or converted (in Visual Basic) to a Tuple<T1, T2, T3> object whose components are of the same types as the current instance. The Tuple<T1, T2, T3>.IStructuralEquatable.Equals method first passes the Item1 values of the Tuple<T1, T2, T3> objects to be compared to the IEqualityComparer.Equals implementation. If this method call returns true, the method is called again and passed the Item2 values of the two Tuple<T1, T2, T3> objects. If this method call returns true again, the method is called a third time and passed the Item3 values of the two Tuple<T1, T2, T3> objects.

The following example defines an Item2Comparer class that implements the IEqualityComparer interface and changes the way in which Tuple<T1, T2, T3> objects are evaluated for equality. The method always returns true when it is passed the Item1 property values of two Tuple<T1, T2, T3> objects, and it calls the Tuple<T1, T2, T3>.IStructuralEquatable.Equals method to evaluate their Item2 property values. If this method call returns true, their Item3 property values are passed to the method, which always returns true. As a result, the method tests for equality based only on the value of the Item2 property. The output illustrates the result for a data set of Tuple<T1, T2, T3> objects that record the names, mean test score, and number of tests of students in a class.

using System;
using System.Collections;

public class Item2Comparer<T1, T2, T3> : IEqualityComparer
{
   new public bool Equals(object x, object y)
   {
      // Return true for all values of Item1. 
      if (x is T1)
         return true;
      else if (x is T2)
         return x.Equals(y);
      else 
         return true;	
   }

   public int GetHashCode(object obj)
   {
      if (obj is T1)
         return ((T1) obj).GetHashCode();
      else if (obj is T2)
         return ((T2) obj).GetHashCode();
      else 
         return ((T3) obj).GetHashCode();
   }                
}

public class Example
{
   public static void Main()
   {
      Tuple<string, double, int>[] scores = 
           { Tuple.Create("Ed", 78.8, 8),
             Tuple.Create("Abbey", 92.1, 9), 
             Tuple.Create("Jim", 71.2, 9),
             Tuple.Create("Sam", 91.7, 8), 
             Tuple.Create("Sandy", 71.2, 5),
             Tuple.Create("Penelope", 82.9, 8),
             Tuple.Create("Serena", 71.2, 9),
             Tuple.Create("Judith", 84.3, 9) };

      for (int ctr = 0; ctr < scores.Length; ctr++)
      {
         IStructuralEquatable score = scores[ctr];
         for (int ctr2 = ctr + 1; ctr2 < scores.Length; ctr2++)
         {
            Console.WriteLine("{0} = {1}: {2}", score, 
                              scores[ctr2], 
                              score.Equals(scores[ctr2], 
                                           new Item2Comparer<string, double, int>()));
         }
         Console.WriteLine();
      }   
   }
}
// The example displays the following output: 
//      (Ed, 78.8, 8) = (Abbey, 92.1, 9): False 
//      (Ed, 78.8, 8) = (Jim, 71.2, 9): False 
//      (Ed, 78.8, 8) = (Sam, 91.7, 8): False 
//      (Ed, 78.8, 8) = (Sandy, 71.2, 5): False 
//      (Ed, 78.8, 8) = (Penelope, 82.9, 8): False 
//      (Ed, 78.8, 8) = (Serena, 71.2, 9): False 
//      (Ed, 78.8, 8) = (Judith, 84.3, 9): False 
// 
//      (Abbey, 92.1, 9) = (Jim, 71.2, 9): False 
//      (Abbey, 92.1, 9) = (Sam, 91.7, 8): False 
//      (Abbey, 92.1, 9) = (Sandy, 71.2, 5): False 
//      (Abbey, 92.1, 9) = (Penelope, 82.9, 8): False 
//      (Abbey, 92.1, 9) = (Serena, 71.2, 9): False 
//      (Abbey, 92.1, 9) = (Judith, 84.3, 9): False 
//       
//      (Jim, 71.2, 9) = (Sam, 91.7, 8): False 
//      (Jim, 71.2, 9) = (Sandy, 71.2, 5): True 
//      (Jim, 71.2, 9) = (Penelope, 82.9, 8): False 
//      (Jim, 71.2, 9) = (Serena, 71.2, 9): True 
//      (Jim, 71.2, 9) = (Judith, 84.3, 9): False 
// 
//      (Sam, 91.7, 8) = (Sandy, 71.2, 5): False 
//      (Sam, 91.7, 8) = (Penelope, 82.9, 8): False 
//      (Sam, 91.7, 8) = (Serena, 71.2, 9): False 
//      (Sam, 91.7, 8) = (Judith, 84.3, 9): False 
// 
//      (Sandy, 71.2, 5) = (Penelope, 82.9, 8): False 
//      (Sandy, 71.2, 5) = (Serena, 71.2, 9): True 
//      (Sandy, 71.2, 5) = (Judith, 84.3, 9): False 
// 
//      (Penelope, 82.9, 8) = (Serena, 71.2, 9): False 
//      (Penelope, 82.9, 8) = (Judith, 84.3, 9): False 
// 
//      (Serena, 71.2, 9) = (Judith, 84.3, 9): False

.NET Framework

Supported in: 4.6, 4.5, 4

.NET Framework Client Profile

Supported in: 4

Portable Class Library

Supported in: Portable Class Library

Supported in: Windows Phone 8.1

Supported in: Windows Phone Silverlight 8.1

Supported in: Windows Phone Silverlight 8
Show:
© 2015 Microsoft