2012-01-11 3 views
1

나는 keysCollection을 Dictionary<long, object>으로 사용하는 클래스가 있으며 다른 클래스에는 키만 전달하려고합니다.액세스 사전 처리 KeyCollection 유지

나는 사전의 (a HashTable 같은) theorical O(1) 별 액세스 인덱스가 있음을 알고 있지만 나는 목록에 keyCollection를 변환 할 경우, 액세스는 O(n)로 변경합니다.

O(1)을 계속 유지하면서 keyCollection을 클래스에 전달할 수 있습니까?

수정 : .NET 2.0을 사용하고 있습니다.

미리 감사드립니다.

+0

하면 "액세스"정의 ... 당신이 의미하는 경우 "인덱스 읽기", 액세스는 여전히 O (1), 실제로 해시 테이블보다 반드시 빠름 * O (1)입니다. 사실, O (1)은 키에 의한 액세스에만 적용됩니다 ** 키의 ** 목록에는 아무런 의미가 없습니다 ** - 목록으로 무엇을하고 싶습니까? –

+0

@MarcGravell : 그렇습니다. 인덱스 (.Contains())를 통한 액세스를 의미합니다. –

+0

@MarcGravell : 사전에 특정 키 값이 포함되어 있는지 알기 위해 키 컬렉션이 필요하므로 키가 필요합니다. –

답변

4

의견에 귀하의 의도는 .Contains()입니다. 이 경우 정확히 찾고자하는 것이 HashSet<T>이며, 이는 키 (값 없음) 만 보유하고 빠른 Contains 수표를 제공합니다. 그래서; Dictionary<long,object>의 경우 다음과 같이 할 수 있습니다.

var set = new HashSet<long>(dictionary.Keys); 

을 전달하면됩니다. 편의상 HashSet<T>ICollection<T>을 구현합니다 (구체적인 유형이 아닌 인터페이스로 범위를 지정하려는 경우). Contains도 있습니다.

ICollection<long> = dictionary.Keys; 

와 그 전달;

사실, (또한 .NET 2.0에서 작동하는)를 사용하는 것이 더 효율적일 수있다 이를 통해 구현되기 때문에 이에 대한 Contains(key)의 구현은, (1) O입니다 :

bool ICollection<TKey>.Contains(TKey item) 
{ 
    return this.dictionary.ContainsKey(item); 
} 
+0

그리고 클래스를 제어한다고 가정하면'HashSet '보다는'ISet '을 받아 들일 것입니다. (사전에서 키를 집합으로 복사하지 않으려면 사전을 가져 와서'ISet '메소드를 구현하는 래퍼 클래스를 만들 수 있습니다.) – porges

+0

고마워, 그게 정확히 내가 물어 본 것. 감사. –

+0

@Porges'ISet '은이 경우에 유용한 방법을 많이 제공하지는 않습니다. 실제로'ICollection '('ISet '요구)이 유용합니다. –