[C#] Dictionary 사용법, 다양한 예제

더 보기: [C#] Dictionary 사용법, 다양한 예제

Key와 Value의 쌍으로 이루어진 Dictionary는 상당히 유용하다.

Value에는 형태를 구애 받지 않고 담을 수 있기에

활용도가 높다 하겠다.

■ 네임스페이스

using System;
using System.Collections.Generic;

■ 선언 및 입력

Dictionary<int, string> dict = new Dictionary<int, string>();


dict.Add(100, "Jhon");

dict.Add(200, "Steven");



//또는 
           Dictionary<string, int> dic = new Dictionary<string, int>()
            {
                {"dog", 2},
                {"iguana", -1},
                {"cat", 1},
                {"cow", 0}
            };

//C# 6.0에서는

Dictionary<string, int> dic = new Dictionary<string, int>()
{
   ["dog"] = 2,
   ["cat"] = 1
}

<int, string> 말고 key,value쌍이라면 어떤 자료형을 선언해도 무방하다.

■ 사용예제

1. foreach

foreach (KeyValuePair<string, int> pair in dic)
{
    Console.WriteLine("{0}, {1}",
        pair.Key,
        pair.Value);
}

2. List

List<string> list = new List<string>(dic.Keys); foreach (string k in list) { Console.WriteLine("{0}, {1}", k, dic[k]); }
List<string> list = new List<string>(dic.Keys);
 
foreach (string k in list)
{
    Console.WriteLine("{0}, {1}",
        k,
        dic[k]);
}

그냥 루프를 돌리는것 보다는

Key를 List에 할당한 후 루프를 돌리는 것이 훨씬 빠르다.

Dictionary는 위 예제와 같이 dic[키값] 형태로 Value를 얻을 수 있다.

3. Key 또는 Value가 있는지 확인하는 방법

//Dictionary에 해당 Key값이 있는지 확인
    Dictionary<int, string> dict = new Dictionary<int, string>();
    dict.Add(100, "Jhon");
    dict.Add(200, "Steven");
 
    if (dict.ConstainKey(200))
    {
        Console.WriteLine(true);
    }

//Dictionary에 해당 Value값이 있는지 확인
    Dictionary<string, int> dict = new Dictionary<string, int>();
    dict.Add("dog", 1);
    dict.Add("cow", 2);
    
    if (dict.ContainsValue(1))
    {
        Console.WriteLine(true);
    }

4. LINQ를 이용해서 Array(배열)를 Dictionary로 변환하기(ToDictionary 사용법)

string[] arr = new string[]
 {
     "Hello",
     "World"
 };
 
 var dict = arr.ToDictionary(item => item, item => true);

5. Index로 접근하기

Dictionary<int, int> dictionary = new Dictionary<int, int>();
 
dictionary[1] = 2;
dictionary[2] = 1;
dictionary[3] = 3;
 
Console.WriteLine(dictionary[1]);
Console.WriteLine(dictionary[2]);

Array와 같이 Index형태로 사용할 수도 있다.

6. 삭제

dic.Remove(key);

7. 다른 Dictionary 변수에 할당

Dictionary<string, string> newDictionary = oldDictionary.ToDictionary(k => k.Key, k => (string) k.Value);

//또는
 Dictionary<string, string> newDictionary = new Dictionary<string, string>();

            foreach (KeyValuePair<string, object> item in oldDictionary)
            {
                newDictionary.Add(item.Key, item.Value.ToString());
                //here item.Value.ToString() is an example
                //you should convert your item to string according to the requirement
            }

■ 활용 예제

1.dynamic

dynamic person = new ExpandoObject();            
person.Name = "Kim";
person.Age = 10;            
person.Display = (Action)(() => { });
person.ChangeAge = (Action<int>)((age) => { person.Age = age; });
person.AgeChanged = null;
person.AgeChanged += new EventHandler((s, e) => { });

// ExpandoObject를 IDictionary로 변환
var dict = (IDictionary<string, object>)person;

// person 의 속성,메서드,이벤트는
// IDictionary 해시테이블에 저정되어 있는데
// 아래는 이를 출력함
foreach (var d in dict)
{
    Console.WriteLine("{0}: {1}", d.Key, d.Value);
}

2. LINQ를 이용한 ToList 활용

Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("1", "test1");
d.Add("2", "test2");
dataGridView1.DataSource = (from entry in d
                            orderby entry.Key
                            select new{entry.Key,entry.Value}).ToList();