2012-04-04 2 views
12
나는 목록에 의해 키가 있습니다 사전이

:C#을 목록으로 사전 키

private Dictionary<List<custom_obj>, string> Lookup; 

내가 ContainsKey를 사용하기 위해 노력하고있어,하지만이 작동하지 않는 것, 나는 아무 생각도 이유가 없다 . 마지막 ContainsKey 사실이어야한다, 내 상식에서

?Lookup.Keys.ElementAt(7)[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
?Lookup.Keys.ElementAt(7)[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
searchObject[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
searchObject[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
?Lookup.ContainsKey(searchObject) 
false 

: 다음은 디버그 내 Visual Studio를 직접 실행 창에서 정보입니다. 바라건대 여기에 충분한 정보를 포함 시켰 으면 좋겠어. 어떤 아이디어?

감사합니다.

답변

14

List<custom_obj> 키 역할을하는 인스턴스는 searchObject가 참조하는 인스턴스와 참조가 동일하지 않습니다.

일치하는 키를 찾기 위해 사전에 참조 동등성 대신 목록의 값을 사용하려면 사전의 constructor에 IEqualityComparer를 제공해야합니다 (List<T>에서 Equals 및 GetHashCode를 재정의 할 수 없기 때문에).

3

조회에 사용 된 실제 목록 인스턴스가 키로 추가 된 인스턴스와 동일한 경우에만 작동합니다. 목록 내용을 비교하지 않습니다. 이것은 두 개의 List 객체를 직접 비교하려고 할 때와 동일한 동작입니다.

8

동일한 요소가 포함 된 두 개의 개별 List이 있습니다. 두 목록이 같은지 확인하는 올바른 방법은 SequenceEqual 메서드입니다.

기본적으로 수행하려는 작업을 수행 할 수 없습니다. 그러나 사용자 정의 IEqualityComparer을 작성하고 Dictionary 생성자로 전달할 수 있습니다. 여기

은 샘플 일반적인 IEqualityComparer입니다 :

class ListComparer<T> : IEqualityComparer<List<T>> 
{ 
    public bool Equals(List<T> x, List<T> y) 
    { 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(List<T> obj) 
    { 
     int hashcode = 0; 
     foreach (T t in obj) 
     { 
      hashcode ^= t.GetHashCode(); 
     } 
     return hashcode; 
    } 
} 

이것은 빠른 - 및 - 더러운 솔루션이었다 된대로 GetHashCode 구현을 개선 할 수 있습니다.

+0

GetHashCode가 수익을 내지 않았습니다. –

+0

빠른 참고 : 답변의 힌트가 있으면이 Comparer를 사용하지 않아야합니다. equals 메소드는 순서에 민감하지만 해시 메소드는 그렇지 않습니다. –

0

조회 방법에서 사용중인 인스턴스가 사전의 키와 동일한 인스턴스인지 확실합니까? 그것이 내가 생각할 수있는 유일한 것입니다.