2014-09-15 5 views
1

내가이어떤 IEqualityComparer가 사전에 사용됩니까?

var dictionary = new Dictionary<MyClass, SomeValue>(); 

같은 사전을 인스턴스화 그리고 MyClass에이 IEqualityComparer<> 구현하는 내 자신의 클래스라고 할 수 있습니다.

Add, Contains, TryGetValue 등과 같은 사전 작업을 할 때 사전에 생성자를 전달하지 않았기 때문에 사전에 기본값 EqualityComparer<T>.Default을 사용합니까? 아니면 MyClass에서 구현하는 IEqualityComparer를 사용합니까?

감사합니다.

+0

'EqualityComparer .Default'가 사용됩니다. http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs – Vache

답변

3

기본 동등 비교자를 사용합니다.

개체가 다른 개체와 동일한 지 비교할 수있는 개체 인 경우 IEqualityComparer이 아닌 IEquatable을 구현해야합니다. 형식이 IEquatable을 구현하는 경우 EqualityCOmparer.Default의 구현으로 사용되며 이후에는 object.Equalsobject.GetHashCode 메서드가 사용됩니다.

IEqualityComparer다른 개체를 평등하게 비교하는 것으로 설계되었습니다.

0

동등 비교자를 명시 적으로 지정하지 않으면 IEqualityComparer<T>.Default이 사용됩니다.

이 기본 동등 비교자는 EqualsGetHashCode 클래스를 사용합니다.

키 클래스가 IEqualityComparer을 구현해서는 안되며, 평등 비교를 다른 클래스에 위임하려면이 인터페이스를 구현해야합니다. 클래스 자체가 평등 비교를 처리하도록하려면 EqualsGetHashCode을 재정의하십시오 (IEquatable<T>을 구현할 수도 있지만 반드시 필요한 것은 아닙니다).

+0

기본 동등 비교자가 내 클래스의 'Equals' 및'GetHashCode' 메소드를 사용하는 경우 - IEqualityComparer를 구현할 때 재정의 된 메소드 <> - 기본적으로 기본 비교자를 사용하지 않고 내 자체를 사용하지 않는다는 것을 의미하지 않습니까? –

+0

아니요. 'IEqualityComparer '의 메소드는 같은 이름이지만 같은 서명은 아니기 때문에 동일한 메소드가 아닙니다. –

관련 문제