2011-01-16 3 views
1

몇 가지 이상한 문제가 있습니다.'포함'메서드가 false를 반환합니다.

나는 요소가 들어있는 EntityCollection<T>을 가지고 있지만 Contains 메서드는 false를 반환합니다.

나는 T의 'Equals'메소드를 오버라이드했지만 'Contains'메소드는 그것을 호출하지 않는다.

내가 foreach (T x in coll) 일 때 x.Equals(element)이 true를 반환합니다.

도움 주셔서 감사합니다.

코드 :

contains(object entCol, object val) 
    { 
     var coll = (ICollection<GraphicSockets>)entCol; 
     var socket = val as GraphicSockets; 
     foreach (GraphicSockets sock in coll) 
      socket.Equals(sock); //true for first element, GraphicSocket's Equals function called 
     coll.Contains(socket);//false, Equals function not called} 

내가 실제로 사용하려는 코드

이 번 일을하지만 난 WCF를 사용하기 시작하면 중지
private static bool contains(object entCol, object val) 
    { 
     Type entColType = typeof(EntityCollection<>).MakeGenericType(val.GetType()); 
     MethodInfo contains = entColType.GetMethod("Contains"); 
     return (bool)contains.Invoke(entCol, new object[] { val }); 
    } 

, 난이 방법은 작동이 포함되어 궁금하다 .. ...

+3

또한 'GetHashCode()'메소드를 재정의 했습니까? – adrianbanks

+0

예, thx – kra

+0

'GetHashCode' 오버라이드 코드 게시 - 버그가있는 경우'Equals'가 실행되지 않습니다. –

답변

3

당신이 사용하는 경우 문제가 사라지지 않습니다

public override int GetHashCode() 
    { 
     return 0; 
    } 

참고이 그냥 디버깅 테스트, 우리는이 문제를 알고 이제 실제


에없는 제안이다하자 내가 설명해.

개체의 ID가 같고 (약함) 약한 ID (GetHashCode)가 있습니다. GetHashCode ID는 bin 번호로 생각할 수 있습니다. 이러한 idenitites는 해시 테이블에 삽입 된 후에 변경하면 안됩니다. 그렇지 않으면 해시 테이블 작업이 올바르게 작동하지 않습니다. GetHashCode()가 0을 반환하게함으로써, 나는 모든 idenitites 중 가장 약한 것을 주었다. "모든 사람들이 같은 저장소에있다". 그러나 그것은 변하지 않았다.

GetHashCode()는 성능 향상에 불과하므로 성능에 만족하면 완료되었습니다. 그렇지 않은 경우, 또 다른 간단한 해시 코드는 Equal 메소드에서 사용 된 모든 비교를 추출하는 것입니다. 예 :

return LastName.GetHashCode()^FirstName.GetHashCode(); 

GetHashCode()는 성능 향상을 위해 너무 많은 시간을 소비하지 않습니다. 어쩌면 위의 경우보다 다음과 같이 perfending 해시 코드가 더 적합 할 수 있습니다.

return LastName.GetHashCode(); 
+0

메이트가 작동합니다. 정말 고마워요! 이것에 대해 설명해 주시겠습니까? – kra

+0

대단히 감사합니다! 객체의 ID를 반환하는 것은 어떻습니까? – kra

1

엔터티 클래스에 IEquatable<T>을 구현하십시오.

+0

나는 이것도 시험해 보았습니다. – kra