C#

【C#】Dictionaryの使い方(連想配列の使用方法まとめ)

C# の Dictionary の使い方について知りたい方向けの記事です。

Dictionary の初期化・追加・更新・削除など基本的な使い方を紹介しています。

ぜひ参考にしてみてください。

Dictionaryとは

Dictionary は、キー(key)と値(value)のペアを保持しているコレクションです。

キー(key):インデックス番号の代わりに使用される名前

値(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」には既に存在する文字を追加する事はできないので注意して使いましょう。

以上、最後まで読んで頂きありがとうございました。

プログラミングを学習したいなら…

プログラミングスキルを身に付けるなら、プログラミングを効率良く学べる
プログラミングスクール」がオススメです。

特にこんな方にオススメ!!
これからエンジニアを目指したい
プログラミングの専門性を高めたい
プログラミングを学んで副業をしたい
エンジニアに転職して年収をアップさせたい

プログラミングを触ったことがない未経験からでも、プログラミングスクールで学習すれば、エンジニアへ就職・転職することも可能です。

あなたの「行動力」と「やる気」で、あなたの人生を大きく変えるチャンスになることでしょう。

プログラミングスクールに興味がある方は是非チェックしてみてください。

> プログラミングを学ぶ <

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA