Tuple<T1,T2,T3,T4,T5>.IStructuralEquatable.Equals Yöntem

Tanım

Geçerli Tuple<T1,T2,T3,T4,T5> nesnenin belirtilen bir karşılaştırma yöntemine göre belirtilen bir nesneye eşit olup olmadığını gösteren bir değer döndürür.

 virtual bool System.Collections.IStructuralEquatable.Equals(System::Object ^ other, System::Collections::IEqualityComparer ^ comparer) = System::Collections::IStructuralEquatable::Equals;
bool IStructuralEquatable.Equals (object other, System.Collections.IEqualityComparer comparer);
abstract member System.Collections.IStructuralEquatable.Equals : obj * System.Collections.IEqualityComparer -> bool
override this.System.Collections.IStructuralEquatable.Equals : obj * System.Collections.IEqualityComparer -> bool
Function Equals (other As Object, comparer As IEqualityComparer) As Boolean Implements IStructuralEquatable.Equals

Parametreler

other
Object

Örnekle karşılaştırılacak nesne.

comparer
IEqualityComparer

İki nesnenin eşit olup olmadığını değerlendirmek için kullanılacak yöntemi tanımlayan nesne.

Döndürülenler

true geçerli örnek belirtilen nesneye eşitse; aksi takdirde , false.

Uygulamalar

Örnekler

Aşağıdaki örnek, arabirimini uygulayan IEqualityComparer bir DoubleComparer sınıfı tanımlar. Örnek, ikinci ve beşinci bileşenleri doldurmak için rastgele bir sayı oluşturucu kullanarak iki Tuple<T1,T2,T3,T4,T5> nesnenin örneğini oluşturur, ilk örneği bir IStructuralEquatable arabirime dönüştürür ve ardından iki Tuple<T1,T2,T3,T4,T5> nesneyi yaklaşık eşitlik için test etmek için bir DoubleComparer nesnesi kullanır.

using System;
using System.Collections;

public class DoubleComparer<T1, T2, T3, T4, T5> : IEqualityComparer
{
   private double difference;
   private int argument = 0;
   
   public DoubleComparer(double difference)
   {
      this.difference = difference;
   }
   
   new public bool Equals(object x, object y)
   { 
      argument += 1;
      
      // Return true for Item1.
      if (argument == 1) return true;

      double d1 = (double) x;
      double d2 = (double) y;

      if (d1 - d2 < d1 * difference)
         return true;
      else            
         return false;
   }
   
   public int GetHashCode(object obj)
   {
      if (obj is T1)
         return ((T1) obj).GetHashCode();
      else if (obj is T2)
         return ((T2) obj).GetHashCode();
      else if (obj is T3)
         return ((T3) obj).GetHashCode();
      else if (obj is T4)
         return ((T4) obj).GetHashCode();
      else
         return ((T5) obj).GetHashCode();   
   }
}

public class Example
{
   public static void Main()
   {
      var value1 = GetValues(1);
      var value2 = GetValues(2);
      IStructuralEquatable iValue1 = value1;
      Console.WriteLine("{0} =\n{1} :\n{2}", value1, value2, 
                        iValue1.Equals(value2, 
                        new DoubleComparer<int, double, double, double, double>(.01)));
   }

   private static Tuple<int, double, double, double, double> GetValues(int ctr)
   {
      // Generate four random numbers between 0 and 1
      Random rnd = new Random((int)DateTime.Now.Ticks >> 32 >> ctr);
      return Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(), 
                          rnd.NextDouble(), rnd.NextDouble());
   }                                   
}
open System
open System.Collections

type DoubleComparer<'T1, 'T2, 'T3, 'T4, 'T5 when 'T1: equality and 'T2: equality and 'T3: equality and 'T4: equality and 'T5: equality>(difference: double) =
    let mutable argument = 0

    interface IEqualityComparer with
        member _.Equals(x, y) =
            argument <- argument + 1
            
            // Return true for Item1.
            if argument = 1 then
                true
            else
                let d1 = x :?> double
                let d2 = y :?> double

                d1 - d2 < d1 * difference

        member _.GetHashCode(obj) =
            match obj with
            | :? 'T1 as obj -> obj.GetHashCode()
            | :? 'T2 as obj -> obj.GetHashCode()
            | :? 'T3 as obj -> obj.GetHashCode()
            | :? 'T4 as obj -> obj.GetHashCode()
            | _ -> (obj :?> 'T5).GetHashCode()   

let getValues ctr =
    // Generate four random numbers between 0 and 1
    let rnd = Random(DateTime.Now.Ticks >>> 32 >>> ctr |> int)
    Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(), rnd.NextDouble(), rnd.NextDouble())

let value1 = getValues 1
let value2 = getValues 2
let iValue1 = value1
printfn $"{value1} =\n{value2} :\n{(DoubleComparer<int, double, double, double, double> 0.01 :> IEqualityComparer).Equals(iValue1, value2)}"
Imports System.Collections

Public Class DoubleComparer(Of T1, T2, T3, T4, T5) : Implements IEqualityComparer
   Private difference As Double
   Private argument As Integer = 0
   
   Public Sub New(difference As Double)
      Me.difference = difference
   End Sub
   
   Public Overloads Function Equals(x As Object, y As Object) As Boolean _
                   Implements IEqualityComparer.Equals
      argument += 1
      
      ' Return true for Item1.
      If argument = 1 Then
         Return True
      Else
         Dim d1 As Double = CDbl(x)
         Dim d2 As Double = CDbl(y)
         If d1 - d2 < d1 * difference Then
            Return True
         Else            
            Return False
         End If
      End If
   End Function
   
   Public Overloads Function GetHashCode(obj As Object) As Integer _
                    Implements IEqualityComparer.GetHashCode
      If TypeOf obj Is T1 Then
         Return CType(obj, T1).GetHashCode()
      ElseIf TypeOf obj Is T2 Then
         Return CType(obj, T2).GetHashCode()
      ElseIf TypeOf obj Is T3 Then
         Return CType(Obj, T3).GetHashCode()
      ElseIf TypeOf obj Is T4 Then
         Return CType(Obj, T4).GetHashCode()
      Else	
         Return CType(obj, T5).GetHashCode()
      End If
   End Function                
End Class

Module Example
   Public Sub Main()
      Dim value1 = GetValues(1)
      Dim value2 = GetValues(2)
      Dim iValue1 As IStructuralEquatable = value1
      Console.WriteLine("{0} ={3}{1} :{3}{2}", value1, value2, _
                        iValue1.Equals(value2, _
                        New DoubleComparer(Of Integer, Double, Double, Double, Double)(.01)), _
                        vbCrLf)
   End Sub
   
   Private Function GetValues(ctr As Integer) As Tuple(Of Integer, Double, Double, Double, Double)
      ' Generate four random numbers between 0 and 1
      Dim rnd As New Random(CInt((DateTime.Now.Ticks >> 32) >> ctr))
      Return Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(), 
                          rnd.NextDouble(), rnd.NextDouble)
   End Function                                   
End Module
' The example displays output like the following:
'    (1, 0.910850029862882, 0.894596965934428, 0.319678635019659, 0.801647342649124) =
'    (2, 0.818546649915421, 0.355961162762698, 0.0438506622071614, 0.679904267042831) :
'    False

Açıklamalar

Bu üye, açık bir arabirim üyesi uygulamasıdır. Yalnızca örnek bir IStructuralEquatable arabirime Tuple<T1,T2,T3,T4,T5> yayınlandığında kullanılabilir.

Uygulama IEqualityComparer.Equals yalnızca othernulldeğilse ve başarıyla dönüştürülebiliyorsa (C#'ta) veya bileşenleri geçerli örnekle aynı türlerde olan bir Tuple<T1,T2,T3,T4,T5> nesneye dönüştürülebiliyorsa (Visual Basic'te) çağrılır. IStructuralEquatable.Equals(Object, IEqualityComparer) yöntemi ilk olarak uygulamayla karşılaştırılacak IEqualityComparer.Equals nesnelerin değerlerini Tuple<T1,T2,T3,T4,T5> geçirirItem1. Bu yöntem çağrısı döndürürsetrue, yöntemi yeniden çağrılır ve iki Tuple<T1,T2,T3,T4,T5> nesnenin Item2 değerleri geçirilir. Yöntem çağrısı false belirli bir değer çiftini Item karşılaştırdığında veya iki Item5 değer yönteme geçirilinceye kadar devam eder.

Şunlara uygulanır