Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 지정된 초기 크기로 대소문자를 구분하는 HybridDictionary 만들기

C#에서 지정된 초기 크기를 가지며 대소문자를 구분하는 HybridDictionary를 만들려면 초기 크기와 대소문자 구분 여부를 함께 지정할 수 있는 생성자를 사용하면 됩니다. 이때 두 번째 인수 caseInsensitivefalse를 전달해야 대소문자를 구분하는 사전이 됩니다.

참고로 HybridDictionary는 항목 수가 적을 때는 내부적으로 ListDictionary를 사용하다가, 항목 수가 많아지면 Hashtable로 자동 전환되어 성능을 최적화하는 컬렉션입니다.

생성자 매개변수 정리

  • initialSize – 컬렉션을 처음 만들 때 예상되는 대략적인 항목 수
  • caseInsensitivetrue이면 대소문자를 구분하지 않고, false이면 대소문자를 구분

예제 1 – 대소문자를 구분하는 경우(false)

다음은 초기 크기가 5이고 대소문자를 구분하는 HybridDictionary를 생성하는 예제입니다.

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo {
   public static void Main() {
      // 초기 크기 5, 대소문자 구분(false)
      HybridDictionary myDict = new HybridDictionary(5, false);
      myDict.Add("A", "AB");
      myDict.Add("B", "BC");
      myDict.Add("C", "DE");
      myDict.Add("D", "FG");
      myDict.Add("e", "fg");

      Console.WriteLine("Key/Value pairs...");
      foreach(DictionaryEntry de in myDict)
         Console.WriteLine("Key = " + de.Key + ", Value = " + de.Value);
   }
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Key/Value pairs...
Key = A, Value = AB
Key = B, Value = BC
Key = C, Value = DE
Key = D, Value = FG
Key = e, Value = fg

대소문자를 구분하기 때문에 "D"와 "e"처럼 서로 다른 키들은 모두 문제없이 추가됩니다.

예제 2 – 대소문자를 구분하지 않는 경우(true)의 키 충돌

반대로 두 번째 인수를 true로 전달하면 대소문자를 구분하지 않는 사전이 됩니다. 이 상태에서는 "e"와 "E"가 서로 다른 키가 아니라 동일한 키로 취급되므로, 두 키를 모두 추가하려고 하면 런타임 예외가 발생합니다.

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo {
   public static void Main() {
      // 초기 크기 5, 대소문자 구분 안 함(true)
      HybridDictionary myDict = new HybridDictionary(5, true);
      myDict.Add("A", "AB");
      myDict.Add("B", "BC");
      myDict.Add("C", "DE");
      myDict.Add("e", "fg");
      myDict.Add("E", "FG"); // "e"와 충돌 발생

      Console.WriteLine("key/Value pairs...");
      foreach(DictionaryEntry de in myDict)
         Console.WriteLine("Key = " + de.Key + ", Value = " + de.Value);
   }
}

출력 결과(오류)

"E"를 추가하는 순간 이미 존재하는 키 "e"와 충돌하여 다음과 같은 오류가 발생합니다.

Run-time exception : An entry with the same key already exists.
Stack Trace:
[System.ArgumentException: An entry with the same key already exists.]
   at System.Collections.Specialized.ListDictionary.Add(Object key, Object value)
   at System.Collections.Specialized.HybridDictionary.Add(Object key, Object value)
   at Demo.Main() :line 15

이처럼 HybridDictionary의 대소문자 구분 여부는 생성 시점에 결정되며 이후에는 변경할 수 없습니다. 키에 대소문자가 섞여 입력될 가능성이 있다면 caseInsensitive 값을 의도에 맞게 신중하게 선택해야 합니다.