この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

IEqualityComparer<T> インターフェイス

 

公開日: 2016年10月

オブジェクトの等価比較をサポートするメソッドを定義します。

名前空間:   System.Collections.Generic
アセンブリ:  mscorlib (mscorlib.dll 内)

public interface IEqualityComparer<in T>

型パラメーター

inT

比較するオブジェクトの型。

名前説明
System_CAPS_pubmethodEquals(T, T)

指定したオブジェクトが等しいかどうかを判断します。

System_CAPS_pubmethodGetHashCode(T)

指定したオブジェクトのハッシュ コードを返します。

このインターフェイスは、コレクションのカスタマイズされた等価比較の実装を使用します。 つまり、型の等価性の定義を作成することができます T, を受け入れるコレクション型を持つこの定義を使用することを指定し、 IEqualityComparer<T> ジェネリック インターフェイスです。 .NET Framework のコンス トラクターで、 Dictionary<TKey, TValue> のジェネリック コレクション型は、このインターフェイスをそのまま使用します。

このインターフェイスの既定の実装がによって提供される、 Default のプロパティ、 EqualityComparer<T> ジェネリック クラスです。 StringComparer クラスが実装する IEqualityComparer<T> 型の Stringです。

このインターフェイスには、等価比較のみがサポートしています。 並べ替えと順序付けの比較のカスタマイズがによって提供される、 IComparer<T> ジェネリック インターフェイスです。

派生させることをお勧め、 EqualityComparer<T> クラスを実装する代わりに、 IEqualityComparer<T> ため、インターフェイス、 EqualityComparer<T> 等しいかどうかを使用するためのテストのクラス、 IEquatable<T>.Equals メソッドの代わりに、 Object.Equals メソッドです。 これは、 Contains, 、IndexOf, 、LastIndexOf, 、および Remove のメソッド、 Dictionary<TKey, TValue> クラスやその他のジェネリック コレクション。

次の例では、カスタム Box ディクショナリ コレクションのオブジェクト。 Box オブジェクトは、ディメンションが同じである場合は、等しいと見なされます。

using System;
using System.Collections.Generic;

class Example
{
   static void Main()
   {
      BoxEqualityComparer boxEqC = new BoxEqualityComparer();

      var boxes = new Dictionary<Box, string>(boxEqC);

      var redBox = new Box(4, 3, 4);
      AddBox(boxes, redBox, "red");

      var blueBox = new Box(4, 3, 4);
      AddBox(boxes, blueBox, "blue");

      var greenBox = new Box(3, 4, 3);
      AddBox(boxes, greenBox, "green");
      Console.WriteLine();

      Console.WriteLine("The dictionary contains {0} Box objects.",
                        boxes.Count);
   }

   private static void AddBox(Dictionary<Box, String> dict, Box box, String name)
   {
      try {
         dict.Add(box, name);
      }
      catch (ArgumentException e) {
         Console.WriteLine("Unable to add {0}: {1}", box, e.Message);
      }
   }
}

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; }

    public override String ToString()
    {
       return String.Format("({0}, {1}, {2})", Height, Length, Width);
    }
}


class BoxEqualityComparer : IEqualityComparer<Box>
{
    public bool Equals(Box b1, Box b2)
    {
        if (b2 == null && b1 == null)
           return true;
        else if (b1 == null | b2 == null)
           return false;
        else if(b1.Height == b2.Height && b1.Length == b2.Length
                            && b1.Width == b2.Width)
            return true;
        else
            return false;
    }

    public int GetHashCode(Box bx)
    {
        int hCode = bx.Height ^ bx.Length ^ bx.Width;
        return hCode.GetHashCode();
    }
}
// The example displays the following output:
//    Unable to add (4, 3, 4): An item with the same key has already been added.
//
//    The dictionary contains 2 Box objects.

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
2.0 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能
トップに戻る
表示: