C #에서 해시 테이블 및 사전 작업

Microsoft .Net Framework는 컬렉션 작업에 대한 탁월한 지원을 제공합니다. 컬렉션은 데이터의 저장 및 검색에 사용됩니다. 애플리케이션에서 컬렉션을 사용하여 동적으로 메모리를 할당하여 요소를 저장 한 다음 필요할 때 키 또는 인덱스를 사용하여 검색합니다. 기본적으로 컬렉션은 컬렉션의 각 요소를 반복하여 액세스 할 수있는 개체 집합을 나타냅니다.

해시 테이블

System.Collections 네임 스페이스의 형식은 데이터를 Object 형식의 개체로 저장합니다. Hashtable은 객체를 키 값 쌍으로 저장할 수있는 데이터 구조를 나타냅니다. 해당 키를 사용하여 Hashtable 클래스의 인스턴스에서 값을 검색 할 수 있습니다. Hashtable 인스턴스에 저장된 키와 값은 모두 객체 유형입니다. 키는 null 일 수 없습니다. 어쨌든 null 값을 저장할 수 있습니다. 다음 코드 목록은 Hashtable 인스턴스에서 키 / 값을 저장하고 검색하는 방법을 보여줍니다.

static void Main()

       {

           Hashtable hashTable = new Hashtable();

           hashTable.Add(1, "Joydip");

           hashTable.Add(2, "James");

           hashTable.Add(3, "Steve");

           Console.WriteLine("The key / value pairs are:--");

           foreach (int key in hashTable.Keys)

           {

               Console.WriteLine("Key: "+ key + " Value: "+ hashTable[key].ToString());

           }

           Console.Read();

       }

Hashtable 클래스의 GetEnumerator () 메서드를 활용 한 다음 컬렉션을 열거하여 저장된 키 / 값 쌍을 검색 할 수도 있습니다. 다음은이를 보여주는 코드 스 니펫입니다.

IDictionaryEnumerator enumerator = hashTable.GetEnumerator();

while (enumerator.MoveNext())

{

Console.WriteLine("Key: " + enumerator.Key.ToString() + " Value: " + enumerator.Value.ToString());

}

또한 DictionaryEntry 클래스를 활용하여 Hashtable의 항목을 반복 할 수 있습니다. 다음 코드 스 니펫은이를 수행하는 방법을 보여줍니다.

Hashtable hashTable = new Hashtable();

hashTable.Add(1, "Joydip");

hashTable.Add(2, "James");

hashTable.Add(3, "Steve");

foreach (DictionaryEntry dictionaryEntry in hashTable)

{

   Console.WriteLine("Key: " + dictionaryEntry.Key.ToString() + " Value: " + dictionaryEntry.Value.ToString());

}

Hashtable에서 항목을 검색하는 것은 다른 비 제네릭 컬렉션에 비해 더 빠릅니다. 그 이유를 이해하겠습니다. 해시 키를 사용하는 버킷의 Hashtable 레코드 (각 버킷에 여러 레코드가 포함될 수 있음). 해시 키는 해싱 알고리즘을 사용하여 자동으로 생성됩니다. MSDN은 다음과 같이 설명합니다. "요소가 Hashtable에 추가되면 해당 요소는 키의 해시 코드를 기반으로 버킷에 배치됩니다. 이후의 키 조회는 키의 해시 코드를 사용하여 하나의 특정 버킷에서만 검색합니다. 따라서 요소를 찾는 데 필요한 주요 비교 횟수가 크게 줄어 듭니다. "

사전

System.Collections.Generic 이름의 일부 중요한 클래스에는 List, Queue, HashSet, LinkedList, Stack, LinkedListNode 및 Dictionary가 있습니다. C #의 Dictionary 클래스는 데이터의 키와 값을 포함 할 수있는 일반 데이터 구조를 나타냅니다. 따라서 Dictionary 인스턴스에 모든 유형의 데이터를 저장할 수 있습니다.

ICollection 인터페이스는 IEnumerable 인터페이스를 확장하지만 IDictionary 및 IList 인터페이스는 모두 ICollection 인터페이스를 확장합니다. Dictionary 클래스는 System.Collections.Generic 네임 스페이스에 포함되어 있습니다. 본질적으로 사전에는 키 / 값 쌍의 일반적인 컬렉션이 포함됩니다. Dictionary 클래스의 Add 메서드를 활용하여 Dictionary 인스턴스에 개체를 저장할 수 있습니다. 사전은 박싱 및 박싱 해제 오버 헤드를 제거하므로 Hashtable보다 빠릅니다.

다음 코드 조각은 Dictionary 인스턴스 내에서 개체를 저장하고 검색하는 방법을 보여줍니다.

Dictionary dictionary = new Dictionary();

dictionary.Add(1, "Joydip");

dictionary.Add(2, "James");

dictionary.Add(3, "Steve");

foreach (KeyValuePair kvp in dictionary)

{

Console.WriteLine(kvp.Key.ToString() + " - " + kvp.Value.ToString());

}

Hashtable과 Dictionary의 기본적인 차이점은 전자는 형식이 지정되지 않았고 boxing 및 un-boxing 오버 헤드가 필요하지만 후자는 입력 된대로 그렇지 않다는 것입니다. 그들 사이에는 또 다른 차이점이 있습니다. 인덱서를 사용하여 Hashtable 인스턴스에서 값을 검색하고 항목이없는 경우 null 값이 반환됩니다. 반대로 Dictionary 인스턴스에서 존재하지 않는 항목을 검색하려고하면 예외가 발생합니다. Hashtable이나 Dictionary는 컬렉션에있는 항목의 순서를 보장하지 않습니다.

Hashtable은 약한 형식의 데이터 구조이지만 Dictionary는 강력한 형식의 데이터 구조입니다. Hashtable과 Dictionary 사이의 선택은 형식 안전 컬렉션이 필요한지 여부에 따라 다릅니다. 대부분의 경우 사전이 좋은 선택입니다. 간단히 말해서 Dictionary는 개선 된 Hashtable입니다. Hashtable보다 Dictionary를 자주 사용합니다.