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

C# StringDictionary에서 값 컬렉션 가져오는 방법


C#의 StringDictionarySystem.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 문으로 손쉽게 순회할 수 있습니다.