Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- fsm
- lower_bound
- 개발일지
- 이득우
- UI 자동화
- 알고리즘
- 게임개발공모전
- DFS
- 운영체제
- 프로그래머스
- 너비우선탐색
- 재귀
- c#
- unity
- 구현
- binary_search
- 인프런
- 게임개발
- 유니티
- upper_bound
- 유한상태기계
- unreal
- 이분탐색
- 언리얼
- 웅진씽크빅
- 백준
- BFS
- 안드로이드
- c++
- 시리얼라이제이션
Archives
- Today
- Total
초고교급 희망
[C#] Dictionary <TKey, TValue> 클래스 본문
728x90
Dictionary란 무엇인가
기본 구조는 Dictionary <TKey, TValue> 형태고
말 그대로 사전처럼 key 값에 value를 저장해서 나중에 찾아보기 쉽게 저장하는 자료형이다.
클래스가 해시 테이블로 구현되기 때문에 Dictionary<TKey,TValue> 키를 사용하여 값을 검색하는 것은 매우 빠르며 O(1)에 가깝다.
검색 속도는 지정된 형식 TKey의 해시 알고리즘 품질에 따라 달라진다.
그럼 간단하게 포켓몬 도감을 만들어보겠습니다.
//선언
Dictionary<int, string> pokemon = new Dictionary<int, string>();
//딕셔너리에 요소 추가.
//key 값은 중복될 수 없다. 하지만 value는 중복 가능하다.
//당연함 key를 인덱스로 내용물을 저장함
pokemon.Add(1,"이상해씨");
pokemon.Add(2,"이상해풀");
pokemon.Add(3,"이상해꽃");
//새 key가 이미 존재하는 값이면 Add 매소드는 throw ArgumentException 된다
try
{
pokemon.Add(3, "메가이상해꽃");
}
catch (ArgumentException)
{
Console.WriteLine("An element with Key = \"3\" already exists.");
}
//Item 속성은 인덱서의 다른 이름이므로 요소에 액세스할 때 해당 이름을 생략할 수 있다.
Console.WriteLine(pokemon[1]); //이렇게 출력하면 이상해씨가 나온다.
Console.WriteLine(pokemon[3]); //이상해꽃이 나온다.
//인덱서를 사용하여 키와 연결된 값을 변경할 수 있다.
pokemon[3] = "메가이상해꽃";
Console.WriteLine(pokemon[3]); //이제 메가이상해꽃이 나온다.
//키가 없는 경우 해당 키에 대한 인덱서를 설정하면 새 키/값 쌍이 추가된다.
pokemon[4] = "파이리"; //Add로 추가한 것처럼 파이리가 추가된다.
//요청한 키가 dictionary에 없으면 인덱서가 exception을 발생시킨다.
//100번째 포켓몬이 없어서 catch가 실행된다.(당연함)
try
{
Console.WriteLine(pokemon[100]);
}
catch (KeyNotFoundException)
{
Console.WriteLine("Key is not found.");
}
//프로그램이 자주 Dictionary에 없는 키를 시도해야 할 때,
//TryGetValue는 값을 검색하는 보다 효율적인 방법이다.
//out 키워드를 반드시 사용해야하고, 원하는 값을 그쪽으로 리턴시킬 수 있다.
string value = "";
if (pokemon.TryGetValue(100, out value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("Key is not found."); //100번째가 없으니 여기가 출력됨
}
if (pokemon.TryGetValue(1, out value))
{
Console.WriteLine(value);
//value로 해당 값이 리턴된다. 이상해씨가 출력됨
}
else
{
Console.WriteLine("Key is not found.");
}
//ContainsKey를 사용하여 키를 삽입하기 전에 테스트할 수 있다.
//ContainsKey는 원하는 값의 존재여부를 확인하기 위해 사용하며 Bool 형태로 결과를 반환한다.
//값이 있으면 true, 없으면 false
if (!pokemon.ContainsKey(5))
{
pokemon.Add(5, "리자드");
Console.WriteLine("Value added for key = \"5\": {0}", pokemon[5]);
}
//key값과 value값 각각을 얻고 싶을 때는 KeyValuePair 구조체를 사용한다.
foreach (KeyValuePair<int, string> kvp in pokemon)
{
Console.WriteLine("{0},{1} ", kvp.Key, kvp.Value);
}
//value값만 얻고 싶을 때
Dictionary<int, string>.ValueCollection valueColl = pokemon.Values;
foreach (string s in valueColl)
{
Console.WriteLine("Value = {0}", s);
}
//key값만 얻고 싶을 때
Dictionary<int, string>.KeyCollection keyColl = pokemon.Keys;
foreach (int i in keyColl)
{
Console.WriteLine("Key = {0}", i);
}
//Remove 메서드를 사용하여 key/value 쌍을 제거한다.
pokemon.Remove(5); //5번 리자드 삭제
if (!pokemon.ContainsKey(5))
{
Console.WriteLine("Key 5 is not found.");
}
실행결과
이렇게 공식 라이브러리의 예제를 통해 간단하게 Dictionary를 알아보았습니다.
출처: https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.generic.dictionary-2?view=net-6.0
728x90
'Game > C#' 카테고리의 다른 글
[C#] Partial 클래스 (0) | 2023.07.15 |
---|---|
[C#] this 연산자 (0) | 2022.07.22 |
[C#] 접근 제한자 (0) | 2022.07.22 |