2016-06-23 5 views
0

参照型の一意の値を取得するには、HashSetを使用してIEqualityComparerを実装する必要がありますが、SortedSetもHashSetで実装する必要はありません。 例を示します。私はそれが私がEmployeeComparerがされたIEqualityComparerを実装している場合にのみ動作しますが、私はにSortedSetを使用している場合、それは私に一意の値を与える名前に基づいて独自の従業員を取得するためのHashSetを使用する必要がある場合SortedSetがIEqualitycomparerを使用せずに一意の出力を与える方法

public class Employee 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public class EmployeeComparer : IEqualityComparer<Employee>, IComparer<Employee> 
{ 

    public bool Equals(Employee x, Employee y) 
    { 
     return string.Equals(x.Name, y.Name); 
    } 
    public int GetHashCode(Employee obj) 
    { 
     return obj.Name.GetHashCode(); 
    } 

    public int Compare(Employee x, Employee y) 
    { 
     return string.Compare(x.Name, y.Name); 
    } 
} 

- 私たちは以下のEmployeeクラスとEmployeeComparerクラスを考えてみましょうEmployeeComparerクラスがIEqualityComparerとIComparerだけを実装していなくても、ここで一意性のためにGetHashCode()とEquals()メソッドを提供する必要はありますか?

答えて

1

IComparer<T>は、2つのオブジェクトが意味的に等しいかどうかを判断するのに十分です。

ICompararer<T>.Compare()0を返す場合、オブジェクトは等しいとみなされます。ゼロ以外の値を返すと、それらは非ゼロとみなされます。 SortedSet<T>は値をソート順に並べ替えることになっているので、比較関数が必要ですが、その上に等価関数は必要ありません。

+0

string.Compareはオブジェクトを比較するための要件であるHashCode比較の要件を内部的に満たしていますか? – LearnAndShare

+0

@ LearnAndShareいいえ、ハッシュコードはオブジェクトを比較するための要件ではありません。 '.Compare()'はオブジェクトの比較に十分です。 – JLRishe

関連する問題