2011-05-16 2 views
0

주어진 개체와 동일한 SortedDictionary에서 키를 검색 할 수있는 방법이 있습니까? 나는 이런 식으로 뭔가 할, 나중에 그런SortedDictionary의 항목과 동일한 키를 가져 옵니까?

var dictionary = SortedDictionary<MyHugeType, int>(); 
var myEnormousKey = new MyHugeType(); 

dictionary[myEnormousKey] = 123; 

: 설명하기 위해, 나는 상당히 메모리 무거운, 불변의 주요 유형이 사전을 만들 말할 수 분명히

// This is a new instance, but it's identical to the previous key 
var myIdenticalKey = new MyHugeType(); 

if(dictionary.ContainsKey(myIdenticalKey)) { 
    myIdenticalKey = dictionary.GetKeyEqualTo(myIdenticalKey); 
} 

// Use myIdenticalKey reference... 

를 SortedDictionary하지 않습니다 "GetKeyEqualTo"메소드가 있습니다. 그러나 비슷한 효과를 얻을 수있는 방법이 있습니까? 이것은 기본적으로 무거운 키 객체를 인턴하는 효과가있어 동일한 인스턴스가 삭제 될 수 있습니다. 열쇠의 색인을 검색하고이어서 일치하는 객체 인스턴스를 검색하여 SortedList 클래스를 사용하여이 작업을 수행 할 수 있지만 SortedDictionary의 일관된 삽입 성능이 내 용도에 더 좋을 것입니다.

일치하는 항목을 검색하거나 내 자신의 BST 클래스를 작성하기 위해 모든 사전의 키를 반복하는 방법이 부족합니다. .NET의 내장 컬렉션을 사용하여이 목표를 달성 할 수있는 방법이 있습니까?

답변

1

값 개체를 int에서 값과 원래 키가 들어있는 구조체 또는 클래스로 변경할 수 있습니다. 그럼 당신이 할 수있는 원래의 키에 액세스하려면 :

dictionary[myIdenticalKey].OriginalKey 

과 같은 값 뭔가 : 당신은 당신의 키 클래스에서 IEquatable 인터페이스를 구현할 수

dictionary[myIdenticalKey].Value 
+0

이제 아이디어가 있습니다. :-) 나는 더 이상의 직접적인 해결책이 없다면 그걸 갈 수도 있습니다. – nonoitall

+0

원하는 기능을 노출하기 위해 클래스를 다시 작성하지 않고 할 수있는 최선의 방법입니다. 감사! – nonoitall

0

. 여기에서 클래스의 두 객체가 서로 같을 때 지정합니다. 그런 다음 ContainsKey을 사용하여 항목의 존재를 테스트하고 true을 반환하면 [] 연산자를 사용하여 항목을 얻을 수 있습니다.

동일한 결과를 얻으려면 IComparer 구현을 제공 할 수도 있습니다.

+0

그러나 SortedDictionary의 [] 연산자는 키와 관련된 _value_를 반환합니다. 열쇠 자체가 필요해. – nonoitall

+0

키가 현재 작업하고있는 키입니다.이 키는 메서드가 동일하다는 것을 나타 내기 때문입니다. 키가 같으면 이전 키 객체와 마찬가지로 현재 키를 사용할 수 있습니다. 원래의 키가 정말로 필요한 경우 @aKzenT와 같은 구현을 변경해야합니다. – Osiris76

+0

하지만 여전히 두 개 (또는이 응용 프로그램에 더 많은) 개체 인스턴스가 있습니다. string.Intern() 메서드와 비슷하게 하나만 제외하고 모두에 대한 참조를 제거하고 싶습니다. 문자열을 사용하지 않는 것입니다. (aKzenT의 방법은 작동 할 것입니다.) – nonoitall

0

Equals()GetHashCode()MyHugeType에 두 개의 인스턴스가 동일한 지 결정하는 코드로 대체하면 사전에 중복 키가 생성되지 않습니다. 너가 말하는게 이거니?

+0

또는 Osiris76이 말한 것처럼'IEquatable'를 구현하십시오. –

관련 문제