2009-06-11 2 views
1

두 개의 사전에 동일한 키와 값이 포함되어 있으면 동일한 해시 코드를 반환하고 똑같을 것이라고 생각할 수 있습니까? 하지만 그들은 - 내가 뭘 잘못하고 있는거야? 또는이 방법으로 사전을 어떻게 비교합니까?사전 (TKey, TValue) GetHashCode 및 동등 - 어떻게 작동합니까?

감사합니다. 아래 코드 동일

/이 경우에도 동일한 순서로 테스트하고 싶습니다.

 SortedDictionary<int,string> sd1 = new SortedDictionary<int,string>(); 
     sd1.Add(1,"one"); 
     sd1.Add(2, "two"); 
     sd1.Add(5, "five"); 
     int sd1Hash = sd1.GetHashCode(); 

     SortedDictionary<int, string> sd2 = new SortedDictionary<int, string>(); 
     sd2.Add(1, "one"); 
     sd2.Add(2, "two"); 
     sd2.Add(5, "five"); 
     int sd2Hash = sd2.GetHashCode(); 

     //This is false 
     bool areEqual = sd1.Equals(sd2); 

답변

4

당신은 컬렉션이 자신의 주문을 포함하여, 동일하다고 테스트하려면 :

bool areEqual = 
    (sd1.Count == sd2.Count) && (sd1.Intersect(sd2).Count() == sd1.Count); 

(SequenceEqual : 당신이 정렬되지 않은 세트로 컬렉션을 치료하고 싶다면

bool areEqual = sd1.SequenceEqual(sd2); 

Intersect도 필요한 경우 IEqualityComparer 매개 변수를 사용할 수 있습니다.

다른 답변에서 설명한 것처럼 SortedDictionaryEquals 또는 GetHashCode의 기본 구현을 재정의하지 않습니다. Equals의 기본 구현은 두 개의 개별 객체를 비교하기 때문에 참조 동등성을 사용하고 false을 반환합니다.

+1

그것은이 방법은 .NET 2.0에서 사용할 수 없다는 것을 알아 내게 꽤했다 :에

당신은 더 많은 정보를 찾을 수 있습니다. .NET 2.0에 대한 대안을 알고 있습니까? – Aamir

+1

해시 코드와 평등을 결정하기 위해 사전의 내용을 보는 독자적인 IEqualityComparer >을 구현해야합니다. – thecoop

+1

@Aamir, 내가 아는 한 .NET2에 대한 대안은 없습니다. 두 컬렉션을 동시에 반복하고 차례대로 각 항목을 비교하는 자체 메서드를 작성하는 것은 어렵지 않지만 (정확히 SequenceEqual 메서드가 수행하는 것입니다). – LukeH

0

두 개의 사전에 동일한 키와 값이 포함되어 있으면 동일한 해시 코드를 반환하고 동일하다고 생각할 수 있습니까?

아니요, 이것은 같음 및 GetHashcode 메서드가 구현되는 방식이 아닙니다. 그것들은 오버라이드되지 않으므로 참조는 단지 참조를 비교하는 기본 System.Object 구현입니다.

같음의 기본 구현은 참조 형식에 대한 참조 평등을 지원하고, 값 유형에 대한 평등을 비트 단위 :

0

당신은이 문제에 대한 MSDN을 확인할 수 있습니다. 참조 동일성은 비교되는 객체 참조가 동일한 객체를 참조 함을 의미합니다. 비트 동등성은 비교되는 객체가 동일한 이진 표현을 가짐을 의미합니다.

그래서 SortedDictionary에는 참조가 포함되어 있으므로 비교됩니다. 그것들은 분명히 다르다. http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

관련 문제