C#에서 지정된 초기 크기를 가지며 대소문자를 구분하는 HybridDictionary를 만들려면 초기 크기와 대소문자 구분 여부를 함께 지정할 수 있는 생성자를 사용하면 됩니다. 이때 두 번째 인수 caseInsensitive에 false를 전달해야 대소문자를 구분하는 사전이 됩니다.
참고로 HybridDictionary는 항목 수가 적을 때는 내부적으로 ListDictionary를 사용하다가, 항목 수가 많아지면 Hashtable로 자동 전환되어 성능을 최적화하는 컬렉션입니다.
생성자 매개변수 정리
- initialSize – 컬렉션을 처음 만들 때 예상되는 대략적인 항목 수
- caseInsensitive –
true이면 대소문자를 구분하지 않고,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 값을 의도에 맞게 신중하게 선택해야 합니다.