본문 바로가기
C#

[C#] Dictionary<TKey,TValue>, Hashtable

by DANEW 2023. 9. 22.

Dictionary<TKey,TValue> 클래스

 

Dictionary<TKey,TValue> 클래스 (System.Collections.Generic)

키와 값의 컬렉션을 나타냅니다.

learn.microsoft.com

- 해시테이블 자료구조에 키들과 값들을 저장하므로 빠르고 효율적임
- Dictionary<TKey,TValue>는 IDictionary 인터페이스의 제네릭 버전, 비제네릭 버전을 모두 구현
 * 단, 제네릭 버전만 공용으로 노출
- Dictionary는 제네릭 IDictionary의 교과서적 구현

반응형
var myDictionary = new Dictionary<string, int>();
 
myDictionary.Add("하나", 1); // add를 통한 추가
myDictionary["둘"] = 20;     // 인덱서를 통한 추가
myDictionary["둘"] = 2;      // 인덱서를 통한 갱신(이미 존재하므로)
myDictionary["셋"] = 3;
 
Console.WriteLine(myDictionary["하나"]);           // 인덱서를 통한 조회
Console.WriteLine(myDictionary.ContainsKey("둘")); // 키 존재 여부 조회 (빠름)
Console.WriteLine(myDictionary.ContainsValue(3));  // 값 존재 여부 조회 (느림)
 
int val = 0;
 
// TryGetValue를 통한 값 조회
if (!myDictionary.TryGetValue("넷", out val))      
{
    Console.WriteLine("존재하지 않음");
}
Console.WriteLine();
 
// 열거
// 1. KeyValuePair<TKey,TValue>를 이용한 열거
foreach (var item in myDictionary)
{
    Console.WriteLine($"{item.Key}: {item.Value}");
}
Console.WriteLine();
 
// 2. Keys (여기서는 string)
foreach (var item in myDictionary.Keys)
{
    Console.WriteLine(item);
}
Console.WriteLine();
 
// 3. Values (여기서는 int)
foreach (var item in myDictionary.Values)
{
    Console.WriteLine(item);
}
Console.WriteLine();

- 주어진 요소의 키를 정수 해시코드로 바꾸고, 해시코드를 적당한 알고리즘을 통해 해시 키로 바꿈
- 해시 키를 통해 자료를 넣거나 조회할 위치를 가져옴

- 키 형식으로는 상등 비교가 가능하고 해시 코드를 얻을 수 있기만 하면 OK
 * 상등 비교: object.Equals / 해시코드: GetHashCode
 * 위 두가지를 재정의하거나 IEqualityComparer 객체를 제공

- 다른 여러 컬렉션과 비슷하게, 사전 생성시 컬렉션의 예상 크기를 지정하면 크기 변경으로 인한 성능 감소를 줄일 수 있음

- 단점
 * 항목이 저장되는 순서가 항목을 추가하는 순서와는 다름
 * 정렬되지 않음

 

HashTable 클래스

 

Hashtable 클래스 (System.Collections)

키의 해시 코드에 따라 구성된 키/값 쌍의 컬렉션을 나타냅니다.

learn.microsoft.com

- Dictionary<TKey,TValue>의 비제네릭 버전
- IDictionary의 비제네릭 버전만 구현한다는 점에서 차이 발생

 

반응형