1. ホーム 
  2. 備忘録 
  3. C Sharp

Dictionary

Dictionary

Dictionary はキーとバリューのコレクションを表す

PHP の連想配列のようなイメージだが、キーとバリューの型は宣言しておく必要があり、また要素の番号を用いたアクセスはできない

中身の要素を全て確認したい場合は foreach などを用いることが多い

以下にいくつかの基本的な Dictionary の使用方法をのせておく

using System;
using System.Collections.Generic;   // Dictionaryを使うには名前空間の使用を宣言する必要がある 
using System.Linq;  // Linqを使った結合を使用する場合に必要

public class Sample
{
    public static void Main()
    {
        // Dictionary<Tkey, Tvalue>で宣言する
        Dictionary<string, int> dict1 = new Dictionary<string, int>();
        dict1.Add( "太郎", 15 );
        dict1.Add( "次郎", 13 );
        dict1.Add( "三郎", 8 );

        // 初期化子を使う場合
        Dictionary<string, int> dict2 = new Dictionary<string, int>() {
            { "雪子", 12 },
            { "月子", 10 },
            { "花子", 6 },
            { "貞子", 999 },
            { "三郎", 10 },
        };

        // 削除
        dict2.Remove( "貞子" ); // キー名で削除する
        // dict2.Clear(); 中身を空にしたいときはこちら
        
        foreach( KeyValuePair<string, int> kvp in dict2 )
        {
            Console.WriteLine( kvp );
            // [雪子, 12]
            // [月子, 10]
            // [花子, 6]
            // [三郎, 10]
        }

        // Linqを使わない結合
        Dictionary<string, int> merge = new Dictionary<string, int>();
        foreach ( KeyValuePair<string, int> kvp in dict1 )
        {
            merge.Add( kvp.Key, kvp.Value );
        }
        foreach ( KeyValuePair<string, int> kvp in dict2 )
        {
            if ( merge.ContainsKey( kvp.Key ) )
            {
                // キーが重複したら無視する。これがないと重複がでた時点でエラー
                continue;
            }
            merge.Add( kvp.Key, kvp.Value );
        }

        // Linqを使った結合
        Dictionary<string, int> linqMerge = dict1.Concat( 
            dict2.Where( pair => !dict1.ContainsKey( pair.Key ) ) ) // キーの重複を避ける
            .ToDictionary( pair => pair.Key, pair => pair.Value ); // Dictionaryとして出力

        foreach ( KeyValuePair<string, int> kvp in linqMerge )
        {
            Console.WriteLine( kvp );
            // [太郎, 15]
            // [次郎, 13]
            // [三郎, 8]
            // [雪子, 12]
            // [月子, 10]
            // [花子, 6]
        }
    }
}

注意

Dictionary は foreach文によるループ中に要素の追加・削除など順序が崩れてしまう操作を行うとエラーとなってしまうので注意すること