C#의 StringDictionary는 System.Collections.Specialized 네임스페이스에 속한 컬렉션으로, 키와 값이 모두 문자열인 해시 테이블을 구현합니다. 이 글에서는 StringDictionary에 저장된 값(value) 컬렉션을 가져와 출력하는 방법을 두 가지 예제와 함께 살펴봅니다.
값 컬렉션을 가져오는 대표적인 방법은 다음과 같습니다.
- Keys.CopyTo() 메서드 – 키 컬렉션을 문자열 배열로 복사한 뒤, 인덱서로 각 키에 해당하는 값을 조회
- Values 속성 – 값 컬렉션(ICollection)을 직접 반환받아 순회
예제 1: 제품 카테고리 데이터
여러 제품 카테고리를 StringDictionary에 추가한 후, 전체 요소와 키·값 컬렉션을 순서대로 출력하는 예제입니다.
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
public static void Main(){
StringDictionary strDict1 = new StringDictionary();
strDict1.Add("S", "가전제품");
strDict1.Add("T", "스마트 웨어러블");
strDict1.Add("U", "전자기기");
strDict1.Add("V", "장난감");
strDict1.Add("W", "도서");
strDict1.Add("X", "액세서리");
Console.WriteLine("StringDictionary 요소 출력...");
foreach(DictionaryEntry d in strDict1){
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("\n키와 값 컬렉션 출력...");
String[] keyArr = new String[strDict1.Count];
strDict1.Keys.CopyTo(keyArr, 0);
for (int i = 0; i < strDict1.Count; i++) {
Console.WriteLine("키 " + (i+1) + " = " + keyArr[i] + ", 값 " + (i+1) + " = " + strDict1[keyArr[i]]);
}
Console.WriteLine("\nStringDictionary에 키 B가 있습니까? " + strDict1.ContainsKey("B"));
}
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
StringDictionary 요소 출력... x 액세서리 s 가전제품 t 스마트 웨어러블 u 전자기기 v 장난감 w 도서 키와 값 컬렉션 출력... 키 1 = x, 값 1 = 액세서리 키 2 = s, 값 2 = 가전제품 키 3 = t, 값 3 = 스마트 웨어러블 키 4 = u, 값 4 = 전자기기 키 5 = v, 값 5 = 장난감 키 6 = w, 값 6 = 도서 StringDictionary에 키 B가 있습니까? False
주요 코드 설명
strDict1.Keys.CopyTo(keyArr, 0): Keys 속성이 반환하는 키 컬렉션을 keyArr 배열의 인덱스 0부터 복사합니다.strDict1[keyArr[i]]: 인덱서를 사용해 해당 키에 연결된 값을 가져옵니다.ContainsKey("B"): 지정한 키가 사전에 존재하는지 검사하여 bool 값을 반환합니다. 첫 번째 예제에는 키 B가 없으므로 False가 출력됩니다.
예제 2: 이름 데이터
이번에는 이름 데이터를 사용해 같은 과정을 반복해 보겠습니다. 이번에는 키 B가 존재하므로 ContainsKey()의 결과가 True로 나타납니다.
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo {
public static void Main(){
StringDictionary strDict1 = new StringDictionary();
strDict1.Add("A", "존");
strDict1.Add("B", "앤디");
strDict1.Add("C", "팀");
strDict1.Add("D", "라이언");
strDict1.Add("E", "케빈");
strDict1.Add("F", "케이티");
strDict1.Add("G", "브래드");
Console.WriteLine("StringDictionary 요소 출력...");
foreach(DictionaryEntry d in strDict1){
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("\n키와 값 컬렉션 출력...");
String[] keyArr = new String[strDict1.Count];
strDict1.Keys.CopyTo(keyArr, 0);
for (int i = 0; i < strDict1.Count; i++) {
Console.WriteLine("키 " + (i+1) + " = " + keyArr[i] + ", 값 " + (i+1) + " = " + strDict1[keyArr[i]]);
}
Console.WriteLine("\nStringDictionary에 키 B가 있습니까? " + strDict1.ContainsKey("B"));
}
}출력 결과
StringDictionary 요소 출력... a 존 b 앤디 c 팀 d 라이언 e 케빈 f 케이티 g 브래드 키와 값 컬렉션 출력... 키 1 = a, 값 1 = 존 키 2 = b, 값 2 = 앤디 키 3 = c, 값 3 = 팀 키 4 = d, 값 4 = 라이언 키 5 = e, 값 5 = 케빈 키 6 = f, 값 6 = 케이티 키 7 = g, 값 7 = 브래드 StringDictionary에 키 B가 있습니까? True
참고 사항
키는 소문자로 변환되어 저장됩니다
실행 결과를 보면 대문자로 추가한 키(A, S, T 등)가 소문자(a, s, t 등)로 출력되는 것을 알 수 있습니다. StringDictionary는 내부적으로 키를 소문자로 변환해 저장하기 때문에 키 비교 시 대소문자를 구분하지 않습니다. 따라서 ContainsKey("B")처럼 대문자로 검색해도 소문자 b와 일치합니다.
Values 속성으로 값만 직접 가져오기
키를 거치지 않고 값 컬렉션만 바로 얻고 싶다면 Values 속성을 사용하는 것이 더 간단합니다.
foreach(string val in strDict1.Values){
Console.WriteLine(val);
}Values 속성은 ICollection 형태로 모든 값을 반환하므로, foreach 문으로 손쉽게 순회할 수 있습니다.