EqualityComparer<T> クラス
定義
IEqualityComparer<T> ジェネリック インターフェイスの実装のための基本クラスを提供します。Provides a base class for implementations of the IEqualityComparer<T> generic interface.
generic <typename T>
public ref class EqualityComparer abstract : System::Collections::Generic::IEqualityComparer<T>, System::Collections::IEqualityComparer
public abstract class EqualityComparer<T> : System.Collections.Generic.IEqualityComparer<T>, System.Collections.IEqualityComparer
[System.Serializable]
public abstract class EqualityComparer<T> : System.Collections.Generic.IEqualityComparer<T>, System.Collections.IEqualityComparer
type EqualityComparer<'T> = class
interface IEqualityComparer<'T>
interface IEqualityComparer
[<System.Serializable>]
type EqualityComparer<'T> = class
interface IEqualityComparer
interface IEqualityComparer<'T>
Public MustInherit Class EqualityComparer(Of T)
Implements IEqualityComparer, IEqualityComparer(Of T)
型パラメーター
- T
比較するオブジェクトの型。The type of objects to compare.
- 継承
-
EqualityComparer<T>
- 属性
- 実装
例
次の例では、 Box
等値比較子を使用して、型のオブジェクトのディクショナリコレクションを作成します。The following example creates a dictionary collection of objects of type Box
with an equality comparer. 2つのボックスは、ディメンションが同じである場合に等しいと見なされます。Two boxes are considered equal if their dimensions are the same. 次に、そのボックスをコレクションに追加します。It then adds the boxes to the collection.
異なる方法で等しいかどうかを定義する等値比較子を使用して、ディクショナリが再作成されます。2つのボックスは、ボリュームが同じである場合に等しいと見なされます。The dictionary is recreated with an equality comparer that defines equality in a different way: Two boxes are considered equal if their volumes are the same.
using System;
using System.Collections.Generic;
class Program
{
static Dictionary<Box, String> boxes;
static void Main()
{
BoxSameDimensions boxDim = new BoxSameDimensions();
boxes = new Dictionary<Box, string>(boxDim);
Console.WriteLine("Boxes equality by dimensions:");
Box redBox = new Box(8, 4, 8);
Box greenBox = new Box(8, 6, 8);
Box blueBox = new Box(8, 4, 8);
Box yellowBox = new Box(8, 8, 8);
AddBox(redBox, "red");
AddBox(greenBox, "green");
AddBox(blueBox, "blue");
AddBox(yellowBox, "yellow");
Console.WriteLine();
Console.WriteLine("Boxes equality by volume:");
BoxSameVolume boxVolume = new BoxSameVolume();
boxes = new Dictionary<Box, string>(boxVolume);
Box pinkBox = new Box(8, 4, 8);
Box orangeBox = new Box(8, 6, 8);
Box purpleBox = new Box(4, 8, 8);
Box brownBox = new Box(8, 8, 4);
AddBox(pinkBox, "pink");
AddBox(orangeBox, "orange");
AddBox(purpleBox, "purple");
AddBox(brownBox, "brown");
}
public static void AddBox(Box bx, string name)
{
try
{
boxes.Add(bx, name);
Console.WriteLine("Added {0}, Count = {1}, HashCode = {2}",
name, boxes.Count.ToString(), bx.GetHashCode());
}
catch (ArgumentException)
{
Console.WriteLine("A box equal to {0} is already in the collection.", name);
}
}
}
public class Box
{
public Box(int h, int l, int w)
{
this.Height = h;
this.Length = l;
this.Width = w;
}
public int Height { get; set; }
public int Length { get; set; }
public int Width { get; set; }
}
class BoxSameDimensions : EqualityComparer<Box>
{
public override bool Equals(Box b1, Box b2)
{
if (b1 == null && b2 == null)
return true;
else if (b1 == null || b2 == null)
return false;
return (b1.Height == b2.Height &&
b1.Length == b2.Length &&
b1.Width == b2.Width);
}
public override int GetHashCode(Box bx)
{
int hCode = bx.Height ^ bx.Length ^ bx.Width;
return hCode.GetHashCode();
}
}
class BoxSameVolume : EqualityComparer<Box>
{
public override bool Equals(Box b1, Box b2)
{
if (b1 == null && b2 == null)
return true;
else if (b1 == null || b2 == null)
return false;
return (b1.Height * b1.Width * b1.Length ==
b2.Height * b2.Width * b2.Length);
}
public override int GetHashCode(Box bx)
{
int hCode = bx.Height * bx.Length * bx.Width;
return hCode.GetHashCode();
}
}
/* This example produces an output similar to the following:
*
Boxes equality by dimensions:
Added red, Count = 1, HashCode = 46104728
Added green, Count = 2, HashCode = 12289376
A box equal to blue is already in the collection.
Added yellow, Count = 3, HashCode = 43495525
Boxes equality by volume:
Added pink, Count = 1, HashCode = 55915408
Added orange, Count = 2, HashCode = 33476626
A box equal to purple is already in the collection.
A box equal to brown is already in the collection.
*
*/
'Imports System.Collections
Imports System.Collections.Generic
Module Program
Dim boxes As Dictionary(Of Box, [String])
Public Sub Main(ByVal args As String())
Dim boxDim As New BoxSameDimensions()
boxes = New Dictionary(Of Box, String)(boxDim)
Console.WriteLine("Boxes equality by dimensions:")
Dim redBox As New Box(8, 4, 8)
Dim greenBox As New Box(8, 6, 8)
Dim blueBox As New Box(8, 4, 8)
Dim yellowBox As New Box(8, 8, 8)
AddBox(redBox, "red")
AddBox(greenBox, "green")
AddBox(blueBox, "blue")
AddBox(yellowBox, "yellow")
Console.WriteLine()
Console.WriteLine("Boxes equality by volume:")
Dim boxVolume As New BoxSameVolume()
boxes = New Dictionary(Of Box, String)(boxVolume)
Dim pinkBox As New Box(8, 4, 8)
Dim orangeBox As New Box(8, 6, 8)
Dim purpleBox As New Box(4, 8, 8)
Dim brownBox As New Box(8, 8, 4)
AddBox(pinkBox, "pink")
AddBox(orangeBox, "orange")
AddBox(purpleBox, "purple")
AddBox(brownBox, "brown")
End Sub
Public Sub AddBox(ByVal bx As Box, ByVal name As String)
Try
boxes.Add(bx, name)
Console.WriteLine("Added {0}, Count = {1}, HashCode = {2}", _
name, boxes.Count.ToString(), bx.GetHashCode())
Catch generatedExceptionName As ArgumentException
Console.WriteLine("A box equal to {0} is already in the collection.", name)
End Try
End Sub
End Module
Public Class Box
Public Sub New(ByVal h As Integer, ByVal l As Integer, ByVal w As Integer)
Me.Height = h
Me.Length = l
Me.Width = w
End Sub
Private _Height As Integer
Public Property Height() As Integer
Get
Return _Height
End Get
Set(ByVal value As Integer)
_Height = value
End Set
End Property
Private _Length As Integer
Public Property Length() As Integer
Get
Return _Length
End Get
Set(ByVal value As Integer)
_Length = value
End Set
End Property
Private _Width As Integer
Public Property Width() As Integer
Get
Return _Width
End Get
Set(ByVal value As Integer)
_Width = value
End Set
End Property
End Class
Class BoxSameDimensions : Inherits EqualityComparer(Of Box)
Public Overloads Overrides Function Equals(ByVal b1 As Box, _
ByVal b2 As Box) As Boolean
If b1 Is Nothing AndAlso b2 Is Nothing Then
Return True
Else If b1 Is Nothing OrElse b2 Is Nothing Then
Return False
End If
Return (b1.Height = b2.Height AndAlso b1.Length = b2.Length _
AndAlso b1.Width = b2.Width)
End Function
Public Overloads Overrides Function GetHashCode(ByVal bx As Box) As Integer
Dim hCode As Integer = bx.Height Xor bx.Length Xor bx.Width
Return hCode.GetHashCode()
End Function
End Class
Class BoxSameVolume : Inherits EqualityComparer(Of Box)
Public Overloads Overrides Function Equals(ByVal b1 As Box, _
ByVal b2 As Box) As Boolean
If b1 Is Nothing AndAlso b2 Is Nothing Then
Return True
Else If b1 Is Nothing OrElse b2 Is Nothing Then
Return False
End If
Return (b1.Height * b1.Width * b1.Length = _
b2.Height * b2.Width * b2.Length)
End Function
Public Overloads Overrides Function GetHashCode(ByVal bx As Box) As Integer
Dim hCode As Integer = bx.Height * bx.Length * bx.Width
Return hCode.GetHashCode()
End Function
End Class
' This example produces an output similar to the following:
' *
' Boxes equality by dimensions:
' Added red, Count = 1, HashCode = 46104728
' Added green, Count = 2, HashCode = 12289376
' A box equal to blue is already in the collection.
' Added yellow, Count = 3, HashCode = 43495525
'
' Boxes equality by volume:
' Added pink, Count = 1, HashCode = 55915408
' Added orange, Count = 2, HashCode = 33476626
' A box equal to purple is already in the collection.
' A box equal to brown is already in the collection.
' *
'
注釈
ジェネリッククラスなどの IEqualityComparer<T> コレクションクラス、またはなどのメソッドを使用して、ジェネリックインターフェイスのカスタム実装を提供するには、このクラスから派生させ Dictionary<TKey,TValue> List<T>.Sort ます。Derive from this class to provide a custom implementation of the IEqualityComparer<T> generic interface for use with collection classes such as the Dictionary<TKey,TValue> generic class, or with methods such as List<T>.Sort.
プロパティは、 Default 型がジェネリックインターフェイスを実装しているかどうかを確認し、存在する場合は、 T
System.IEquatable<T> EqualityComparer<T> メソッドの実装を呼び出すを返し IEquatable<T>.Equals ます。The Default property checks whether type T
implements the System.IEquatable<T> generic interface and, if so, returns an EqualityComparer<T> that invokes the implementation of the IEquatable<T>.Equals method. それ以外の場合は、 EqualityComparer<T> によって提供されるを返し T
ます。Otherwise, it returns an EqualityComparer<T>, as provided by T
.
EqualityComparer<T> IEqualityComparer<T> クラスは、メソッド EqualityComparer<T> の代わりにメソッドを使用して等価性をテストするため、インターフェイスを実装する代わりに、クラスから派生させることをお勧めし IEquatable<T>.Equals Object.Equals ます。We recommend that you derive from the EqualityComparer<T> class instead of implementing the IEqualityComparer<T> interface, because the EqualityComparer<T> class tests for equality using the IEquatable<T>.Equals method instead of the Object.Equals method. これは、 Contains
IndexOf
LastIndexOf
Remove
Dictionary<TKey,TValue> クラスとその他のジェネリックコレクションの、、、およびメソッドと一致します。This is consistent with the Contains
, IndexOf
, LastIndexOf
, and Remove
methods of the Dictionary<TKey,TValue> class and other generic collections.
コンストラクター
EqualityComparer<T>() |
EqualityComparer<T> クラスの新しいインスタンスを初期化します。Initializes a new instance of the EqualityComparer<T> class. |
プロパティ
Default |
汎用引数で指定された型に対して、等値であるかどうかを比較するための既定の比較子を返します。Returns a default equality comparer for the type specified by the generic argument. |
メソッド
Equals(Object) |
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object. (継承元 Object) |
Equals(T, T) |
派生クラスでオーバーライドされた場合、 |
GetHashCode() |
既定のハッシュ関数として機能します。Serves as the default hash function. (継承元 Object) |
GetHashCode(T) |
派生クラスでオーバーライドされた場合、ハッシュ アルゴリズムや、ハッシュ テーブルなどのデータ構造体の指定したオブジェクトに使用するハッシュ関数として機能します。When overridden in a derived class, serves as a hash function for the specified object for hashing algorithms and data structures, such as a hash table. |
GetType() |
現在のインスタンスの Type を取得します。Gets the Type of the current instance. (継承元 Object) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object. (継承元 Object) |
ToString() |
現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object. (継承元 Object) |
明示的なインターフェイスの実装
IEqualityComparer.Equals(Object, Object) |
指定したオブジェクトが等しいかどうかを判断します。Determines whether the specified objects are equal. |
IEqualityComparer.GetHashCode(Object) |
指定したオブジェクトのハッシュ コードを返します。Returns a hash code for the specified object. |