TryGetValue와 ContainsKey는 키가 분산 된 해시가있는 한 그 크기에서 매우 빠릅니다.
사전에는 색인 할 수있는 "버킷"수가 있습니다. 키에 의해 값을 추가하거나 찾으면 GetHashCode()에 의해 반환 된 값을 취해 버킷의 수보다 작게 다시 해시합니다 (일반적으로 모듈로와 같은 간단한 것이지만 구현은 정의되지 않음). 관련 버킷을 살펴보십시오.
버킷에는 현재 0 개 이상의 항목이 있습니다. 사전은 .Equals()를 사용하여 각 항목을 키와 비교합니다.
오른쪽 버킷을 찾는 첫 번째 비트는 일정 시간 O (1)이 될 것입니다. 버킷의 키와 키를 비교하는 두 번째 비트는 단 시간 O (n) 일 것입니다. 여기서 n은 전체 모음이 아닌 해당 버킷의 항목 수와 관련이 있습니다.
일반적으로 각 버킷에는 항목이 거의 없어야합니다 (버킷 수는이 경우 계속 유지하려고합니다). 따라서 작업은 본질적으로 일정 시간입니다.
그러나 해시 코드가 제대로 구현되지 않은 경우 동일한 버킷에 많은 키가 있습니다. 매번 0을 반환하는 고의적으로 나쁜 GetHashCode를 가진 객체를 실험하여 볼 수 있듯이 시간 복잡도는 O (n)에 가깝고 가까워 질 것입니다. List가 O (n)이기 때문에 Dictionary보다 더 많은 오버 헤드가 있기 때문에 더 나쁜 경우 List보다 나쁩니다.
걱정할 필요가있는 것이 있습니까? 아니, 상대적으로 순진한 해싱 방법조차도 비교적 좋은 결과를 제공해야합니다. 문자열 키를 사용한다면 아마도 이미 충분히 좋은 것일 것입니다. 간단한 기본 제공 유형을 사용하는 경우 훨씬 더 그렇습니다.
사전 액세스가 느린 경우이 문제에주의하고 GetHashCode() 메소드를 수정하거나 GetHashCode() 및 Equals()에 대한 외부 규칙을 정의 할 수있는 IEqualityComparer)를 사용하여 사전, 해시 세트 등).
대부분의 경우에도 3000은 아무 것도 아니지만 괜찮습니다.
시도해보고 측정하십시오! – Brian