Dictionaryてどうやって使うの!?
この記事は「C# の Dictionary の使い方について知りたい」という方にオススメの記事です。
Dictionary(連想配列)の初期化・追加・更新・削除など基本的な使い方をサンプルコードを交えて詳しく紹介しています。
ぜひ参考にしてみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
Dictionaryとは
Dictionary は、キー(key)と値(value)のペアを保持しているコレクションです。
- キー(key)とは・・・
インデックス番号の代わりに使用される名前のことです。配列やリストはインデックス番号(数値)を使用してコレクションを管理しますが、Dictionary は名前で管理します。 - 値(value)とは・・・
コレクションの要素のことです。String 型やデータ型などを格納することができます。
この「key」と「value」の組み合わせで扱う配列のことを「連想配列」と言います。この配列に当てはまる Dictionary クラスも連想配列になります。
Dictionary<TKey,TValue> クラス
「key」、「value」のどちらも任意の型(string / int / double 等)もしくはクラスを指定することができます。
「key」の値を使うことで「value」の値を設定または取得することができます。List や配列と違うのは、要素を取得する際はインデックス番号ではなく、文字列や double 型などが使えるという点です。
このように「key」と「value」の関係で紐づけができるのでデータを管理する上でとても便利なコレクションです。
Dictionaryの使い方
ここからは Dictionary クラスを使う方法について紹介をします。
名前空間の追加する
Dictionary を利用する場合は、C#のコードのヘッダー部分に名前空間を追加します。
using を使って、以下のように記述します。
using System.Collections.Generic;
Dictionary クラスは、System.Collections.Generic という名前空間に定義されています。
初期値をセットする
- Dictionary<key, value> 変数名 = new Dictionary<key, value>();
- Dictionary<key, value> 変数名 = new Dictionary<key, value>() { 初期化子 };
- Dictionary<key, value> 変数名 = new Dictionary<key, value> { 初期化子 };
Dictionary のインスタンスを生成して、初期値をセットします。
ここでは「key」を string 型、「value」を Brush クラスにしています。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>()
{
{ "赤", Brushes.Red },
{ "緑", Brushes.Green },
{ "黄", Brushes.Yellow },
{ "青", Brushes.Blue },
};
}
}
}
要素を追加する
Add(key, value) : 指定したキーと値をディクショナリに追加
Dictionary クラスには Add というメソッドがあり、この関数を使って要素を追加することができます。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
}
}
}
上記の例外を回避する方法として、ContainsKey メソッドを使って「key」 が存在するかどうかをチェックしてから追加する方法です。
var colors = new Dictionary<string, Brush>();
// 赤のkeyが存在しないなら追加する
if (!colors.ContainsKey("赤"))
{
colors.Add("赤", Brushes.Red);
}
// 緑のkeyが存在しないなら追加する
if (!colors.ContainsKey("緑"))
{
colors.Add("緑", Brushes.Green);
}
// 黄のkeyが存在しないなら追加する
if (!colors.ContainsKey("黄"))
{
colors.Add("黄", Brushes.Yellow);
}
// 青のkeyが存在しないなら追加する
if (!colors.ContainsKey("青"))
{
colors.Add("青", Brushes.Blue);
}
要素を全て取得する
Dictionary の要素を全て取得するには foreach 文で「key」と「value」の値を取得します。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
foreach (var color in colors)
{
Debug.WriteLine(color.Key);
Debug.WriteLine(color.Value);
}
}
}
}
実行した結果は次の通りです。
赤
#FFFF0000
緑
#FF008000
黄
#FFFFFF00
青
#FF0000FF
キーを指定して要素を取得する(方法1)
Dictionary に存在する「key」を指定することで、特定の value を取得します。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
Debug.WriteLine(colors["赤"]);
}
}
}
実行した結果は次の通りです。
#FFFF0000
キーを指定して要素を取得する(方法2)
TryGetValue(key, out value) : 指定したキーに関連付けられている値を取得
Dictionary の TryGetValue メソッドを使って、指定した「key」に関連付けられている「value」を取得します。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
Brush? brush = Brushes.Transparent;
bool result = colors.TryGetValue("赤", out brush);
Debug.WriteLine(brush);
}
}
}
実行した結果は次の通りです。
#FFFF0000
要素数を取得する
Dictionary の Count プロパティを使って要素数を取得します。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
Debug.WriteLine(colors.Count);
}
}
}
実行した結果は次の通りです。
4
特定の要素数を取得する
Dictionary の Count メソッドを使ってある特定の要素数だけを取得することができます。
以下の例では 自作メソッド(MyCount)の条件式に一致した数をカウントします。
using System;
using System.Linq;
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
// 特定の条件に一致した要素のみ数える
var func = new Func<KeyValuePair<string, Brush>, bool>(MyCount);
Debug.WriteLine(colors.Count(func));
}
private bool MyCount(KeyValuePair<string, Brush> color)
{
var key = color.Key;
var val = color.Value;
return val == Brushes.Red && val == Brushes.Green;
}
}
}
実行した結果は次の通りです。
2
要素を更新する
Dictionary の「key」または「value」は値を更新することができます。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
Debug.WriteLine(colors["青"]);
//更新
colors["青"] = Brushes.DarkBlue;
Debug.WriteLine(colors["青"]);
}
}
}
実行した結果は次の通りです。
#FF0000FF
#FF00008B
1つの要素を削除する
Remove() : 指定したキーを持つ値を Dictionary から削除
Dictionary の「key」を指定して削除することができます。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
colors.Remove("緑");
foreach (var color in colors)
{
Debug.WriteLine(color.Key);
Debug.WriteLine(color.Value);
}
}
}
}
実行した結果は次の通りです。
赤
#FFFF0000
黄
#FFFFFF00
青
#FF0000FF
全ての要素を削除する
Clear() : Dictionary からすべてのキーと値を削除
Dictionary の Clear メソッドを使うことで全ての要素をすることができます。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
colors.Clear();
Debug.WriteLine(colors.Count);
}
}
}
実行した結果は次の通りです。
0
Dictionary型をList型に変換する
LINQ の ToList メソッドを使用して List 型へ変換します。List 型へ変換すると KeyValuePair 型として扱われます。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
using System.Linq;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var colors = new Dictionary<string, Brush>();
colors.Add("赤", Brushes.Red);
colors.Add("緑", Brushes.Green);
colors.Add("黄", Brushes.Yellow);
colors.Add("青", Brushes.Blue);
// Dictionary型をList型に変換する
List<KeyValuePair<string, Brush>> list = colors.ToList();
// List型に追加する
list.Add(new KeyValuePair<string, Brush>("白", Brushes.White));
foreach(var element in list)
{
Debug.WriteLine(element.Key);
Debug.WriteLine(element.Value);
}
}
}
}
実行した結果は次の通りです。
赤
#FFFF0000
緑
#FF008000
黄
#FFFFFF00
青
#FF0000FF
白
#FFFFFFFF
List型をDictionary型に変換する
LINQ の Zip メソッドと ToDictionary メソッドを使うことで、2つの List のうち片方を「key」として扱い、もう片方を「value」として扱うことができます。
using System.Windows;
using System.Diagnostics;
using System.Windows.Media;
using System.Collections.Generic;
using System.Linq;
namespace DictionarySample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var list1 = new List()
{
"赤",
"緑",
"黄",
"青",
};
var list2 = new List()
{
Brushes.Red,
Brushes.Green,
Brushes.Yellow,
Brushes.Blue,
};
Dictionary<string, Brush> colors =
list1.Zip(list2, (x, y) => new { x, y }).ToDictionary(z => z.x, z => z.y);
foreach (var color in colors)
{
Debug.WriteLine(color.Key);
Debug.WriteLine(color.Value);
}
}
}
}
実行した結果は次の通りです。
赤
#FFFF0000
緑
#FF008000
黄
#FFFFFF00
青
#FF0000FF
白
#FFFFFFFF
まとめ
この記事では Dictionary クラスの使い方についてまとめて紹介しました。
Dictionary は「key」と「value」の組み合わせで使用することができる配列のことです。「key」に任意の名前を付与することができるので「value」が検索しやすく、データ操作を容易に行うことができます。
「key」には既に存在する文字を追加する事はできないので注意して使いましょう。
以上、最後まで読んで頂きありがとうございました。