[C#] ディクショナリー(Dictionary)の使い方まとめ

ジェネリックコレクションの1つディクショナリークラスの使い方のまとめです。

ディクショナリーはキーと値のペア(KeyValuePair)のコレクションになります。
リストのインデックスの代わりの名前がキー(Key)値(Value)はそのままの意味で要素の値になります。
キーと値それぞれにデータ型を指定する必要があります。

キーをint型にしてインデックスのように連番ではなく意味のある数値をキーにして値を取得したり、
キーをstring型にして表の列名を付け、列名で値を取得したりできます。

また、キーは重複しないしように設定する必要があります。

スポンサーリンク

Dictionaryクラスの使い方

ディクショナリークラスを使うには名前空間System.Collections.Genericが必要です。

using System.Collections.Generic;
スポンサーリンク

Dictionaryオブジェクトの宣言と初期化

クラスなのでnewキーワードでインスタンスを作成して使います。
またキーと値のデータ型を指定する必要があります。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがint型、値がstring型のDictionary
        var dic1 = new Dictionary<int, string>();

        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();

        // キーがstring型、int型のリスト型のDictionary
        var dic3 = new Dictionary<string, List<int>>();
    }
}

Dictionaryの後ろに<キーの型, 値の型>で型の指定を行います。

初期化について

宣言と同時に値を代入することができます。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがint型、値がstring型のDictionary
        var dic1 = new Dictionary<int, string>() { { 1, "a" }, { 2, "b" }, { 3, "c" } };

        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>() { { "Coloum1", "a" }, { "Column2", "b" } };

        // キーがstring型、intのリスト型のDictionary
        var dic3 = new Dictionary<string, List<int>>()
        {
            { "No1", new List<int>(){ 1, 2, 3 } },
            { "No2", new List<int>(){ 4, 5, 6 } },
        };
    }
}

値の代入は { } の中に {キー, 値} をカンマ区切りで指定します。

スポンサーリンク

要素の追加(Add)

Addメソッドでキー、値を指定して要素を追加することができます。
第1引数にはキーに設定する値、
第2引数にはに設定する値を指定します。
どちらも宣言で定義した型である必要があります。

using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがint型、値がstring型のDictionary
        var dic1 = new Dictionary<int, string>();
        dic1.Add(1, "a");
        dic1.Add(2, "b");

        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();
        dic2.Add("Column1", "a");
        dic2.Add("Column2", "b");

        // キーがstring型、intのリスト型のDictionary
        var dic3 = new Dictionary<string, List<int>>();
        dic3.Add("No1", new List<int>() { 1, 2, 3 });
        dic3.Add("No2", new List<int>() { 4, 5, 6 });
    }
}

Addメソッドで要素を追加する際に、重複するキーを指定するとエラーになるので注意してください。

スポンサーリンク

要素の追加、変更(インデクサ)

インデクサ [ ]を使って要素を追加することができます。
こちらは重複するキーを指定した場合、値が上書きされます。

ディクショナリー名[キー] = 値; という感じで追加します。
どちらも宣言で定義した型である必要があります。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがint型、値がstring型のDictionary
        var dic1 = new Dictionary<int, string>();
        dic1[1] = "a";
        dic1[2] = "b";
        dic1[2] = "c";  // 値を上書き
        foreach (KeyValuePair<int, string> kv in dic1) {
            Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
        }

        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();
        dic2["Column1"] = "a";
        dic2["Column2"] = "b";
        dic2["Column2"] = "c";  // 値を上書き
        foreach (var kv in dic2) {
            Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
        }
    }
}

出力結果はこんな感じです。

Key=1, Valule=a
Key=2, Valule=c
Key=Column1, Valule=a
Key=Column2, Valule=c

Console.WriteLineで使ってる $ってなに?という人はこちらをご覧ください。

スポンサーリンク

要素の削除(Remove)

Removeメソッドでキーを指定して要素を削除することができます。
引数にはキーを指定します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();
        dic2["Column1"] = "a";
        dic2["Column2"] = "b";
        dic2["Column3"] = "c";
        Console.WriteLine("Remove前");
        foreach (var kv in dic2) {
            Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
        }

        dic2.Remove("Column3");
        Console.WriteLine("Remove後");
        foreach (var kv in dic2) {
            Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
        }
    }
}

出力結果はこんな感じです。

Remove前
Key=Column1, Valule=a
Key=Column2, Valule=b
Key=Column3, Valule=c
Remove後
Key=Column1, Valule=a
Key=Column2, Valule=b
スポンサーリンク

各要素を取り出す(foreach)

foreachを使うと各要素を取り出すことが出来ます。
上のサンプルコードですでに使っていますが、foreachのコレクションにDictionaryを指定するとKeyValuePairというクラスが各要素として返っています。

KeyValuePairの宣言もキーと値それぞれの型を指定する必要があるため、var を使うと便利です。

キーを取得するにはKeyValuePairのKeyプロパティ
値を取得するにはKeyValuePairのValueプロパティを使います。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();
        dic2["Column1"] = "a";
        dic2["Column2"] = "b";
        dic2["Column3"] = "c";
        foreach (var kv in dic2) {
            Console.WriteLine($"Key={kv.Key}, Valule={kv.Value}");
        }
    }
}
Key=Column1, Valule=a
Key=Column2, Valule=b
Key=Column3, Valule=c
スポンサーリンク

各要素を取り出す(インデクサ)

インデクサ [ ] にキーを指定して要素を取り出すことができます。
こちらは存在しないキーを指定するとエラーになってしまいます。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがint型、値がstring型のDictionary
        var dic1 = new Dictionary<int, string>();
        dic1.Add(1, "a");
        dic1.Add(2, "b");
        System.Console.WriteLine(dic1[1]);

        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();
        dic2.Add("Column1", "a");
        dic2.Add("Column2", "b");
        Console.WriteLine(dic2["Column2"]);
    }
}
a
b
スポンサーリンク

指定したキーが存在していたら値を取得する(TryGetValue)

TryGetValueメソッドを使うとキーが存在していた場合に値を取り出すことができます。
存在していないキーを指定した場合もエラーにはなりません。

第1引数キー第2引数値を代入するための変数を指定します。
戻り値はキーが存在した場合にTrue、なかった場合はFalseが返ってきます。
なので戻り値がTrueの場合は値が取得できたということになります。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();
        dic2.Add("Column1", "a");
        dic2.Add("Column2", "b");

        Console.WriteLine(dic2.TryGetValue("Column2", out string col2_Value));
        Console.WriteLine(col2_Value);

        Console.WriteLine(dic2.TryGetValue("Column99", out string col99_Value));
        Console.WriteLine(col99_Value);
    }
}

出力結果はこんな感じです。

True
b
False

変数col99_Valueは出力されていませんが、値は取得されずnullが入っています。

第2引数にある outってなに?という人はこちらをご覧ください。

スポンサーリンク

指定したキーがすでに存在しているかチェックする

キーが重複しているか判定するにはContainKeysメソッドを使います。
ContainKeysメソッドは引数で指定されたキーがすでにディクショナリー内にある場合はTrue、ない場合にFalseを返します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();
        dic2.Add("Column1", "a");
        dic2.Add("Column2", "b");
        // キーの重複チェック
        Console.WriteLine(dic2.ContainsKey("Column1"));  // True
        Console.WriteLine(dic2.ContainsKey("Column99")); // False
    }
}
スポンサーリンク

キーの一覧を取得する

Keysプロパティを使うをディクショナリーに格納されているキーの一覧を取得することができます。
Keysは宣言で定義したキーの型のコレクションになっています。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        // キーがstring型、値がstring型のDictionary
        var dic2 = new Dictionary<string, string>();
        dic2["Column1"] = "a";
        dic2["Column2"] = "b";
        dic2["Column3"] = "c";

        // キーの一覧を取得
        foreach (var key in dic2.Keys) {
            Console.WriteLine(key);
        }
    }
}
Column1
Column2
Column3

C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました