C# の Dictionary の使い方について知りたい方向けの記事です。
Dictionary の初期化・追加・更新・削除など基本的な使い方を紹介しています。
ぜひ参考にしてみてください。
Dictionaryとは
Dictionary は、キー(key)と値(value)のペアを保持しているコレクションです。
[jin_icon_checkcircle color=”#9c9c9c” size=”14px”]キー(key):インデックス番号の代わりに使用される名前
[jin_icon_checkcircle color=”#9c9c9c” size=”14px”]値(value):コレクションの要素
この「key」と「value」の組み合わせで扱う配列のことを「連想配列」と言います。この配列に当てはまる Dictionary クラスも連想配列になります。
Dictionary<TKey,TValue> クラス
「key」、「value」のどちらも任意の型(string / int / double 等)もしくはクラスを指定することができます。
「key」の値を使うことで「value」の値を設定または取得することができます。List や配列と違うのは、要素を取得する際はインデックス番号ではなく、数値や文字列などが使えるという点です。
Dictionary の「key」を扱う上での注意点は「key」に同じ値を指定できないです。
このように「key」と「value」の関係で紐づけができるのでデータを管理する上でとても便利なコレクションです。
Dictionaryの使い方
ここからは Dictionary クラスを使う方法について紹介をします。
名前空間の追加する
Dictionary を利用する場合は、C#のコードのヘッダー部分に名前空間を追加します。
using を使って、以下のように記述します。
using System.Collections.Generic;
Dictionary クラスは、System.Collections.Generic という名前空間に定義されています。
初期値をセットする
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 },
};
}
}
}
要素を追加する
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);
}
}
}
要素を追加する際、既に存在する「key」を指定すると「System.ArgumentException」という例外が発生します。
上記の例外を回避する方法として、ContainsKey メソッドを使って「key」 が存在するかどうかをチェックしてから追加する方法です。
var colors = new Dictionary<string, Brush>();
if (!colors.ContainsKey("赤")) { colors.Add("赤", Brushes.Red); }
if (!colors.ContainsKey("緑")) { colors.Add("緑", Brushes.Green); }
if (!colors.ContainsKey("黄")) { colors.Add("黄", Brushes.Yellow); }
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)
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;
// 特定の条件に一致した要素のみ数える
if (val == Brushes.Red)
return true;
else if (val == Brushes.Green)
return true;
else
return false;
}
}
}
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つの要素を削除する
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
全ての要素を削除する
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」には既に存在する文字を追加する事はできないので注意して使いましょう。
以上、最後まで読んで頂きありがとうございました。
コメント