PR

[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# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント