Quantcast
Channel: 連想配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 129

【C#】WPFアプリケーションで連想配列を使う

$
0
0

配列

配列を宣言すると、要素が割り当てられます。C#で配列を宣言すると以下のようになります。

int[] array = new int[4]

array配列には[0]~[3]まで利用可能な配列要素が生成されます。
例えば、身長の集合$A = \{160, 170, 180\}$があったとし、これを配列に対応させれば次のようになります。

array[0] = 160;
array[1] = 170;
array[2] = 180;

配列は同じデータ集合でそれぞれの値を保持するのによく用います。

連想配列

同じデータの集合であればいいのですが、配列要素ごとに別のデータの集合を入れておくとき、名前がついていないと不便です。そこで、配列要素1つ1つに名前を付けて管理すれば、配列の何番目がどのデータを示しているかが分かりやすくなります。連想配列は Dictionary インスタンスを用いて宣言します。

//Dictionary インスタンスを使うための Using ディレクティブ
using System.Collections.Generic; 
//Dictionary の宣言
var array = new Dictionary<"Keyの型", "Valueの型">();

< > の中には <キーの型, 値の型> を指定することで各配列要素をキーとして管理し、その管理しているキーに値を入れておくことができます。キーと値を追加するには Add メソッドを用います。

array.Add("配列の名前(Key)", "配列に代入する値(Value)");

例えば、速度の集合$ V = \{10, 20, 30\}$ 、質量の集合$ M = \{2, 3, 4\}$ 、大きさの集合$ S = \{100, 120, 150\}$があったとし、各集合から1つのデータを無作為に抽出したとすればイメージとして次のようになります。(あくまでイメージです。)

array[速度V] = 20 -----> 速度 (array[0]) には 20 という値が結びつく
array[質量M] = 2 ------> 質量 (array[1]) には 170 という値が結びつく
array[大きさS] = 100 --> 大きさ (array[2]) には 100 という値が結びつく

このようにすれば「配列の何番がどのデータを示すんだっけ...?」という心配がなくなります。

Dictionary のメソッドの .Keys と .Values について

Dictionary には様々なメソッドがあります。Key だけ、Value だけを取り出す方法があり、どちらかを取得して利用することもできる。先ほどの Dictionary と Add であらかじめ連想配列が定義されているとしたときを考えます。(Key, Value 共に string 型として扱います。)

Dictionary で宣言した連想配列の Key だけを取り出す場合

//キーを保管するための配列
string[] key = new string[4];
int i = 0;

//キーが存在する回数だけ繰り返し、key に保管する
foreach(string Key in array.Keys)
{
       key[i] = Key;
       i++;
}

Dictionary で宣言した連想配列の Value だけを取り出す場合

//値を保管するための配列
string[] value = new string[4];
int j = 0;

//値が存在する回数だけ繰り返し、value に保管する
foreach(string Value in array.Values)
{
       value[j] = Value;
       j++;
}

WPFでの実装

ここまでの内容を使って、実際に実装してみます。まずはUIから。
適当にオブジェクトを配置していきます。
2019-05-27 (2).png
XAMLコードも載せておきます。

MainWindow.xaml
<Window x:Class="_006_連想配列.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_006_連想配列"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="300">
    <Grid>
        <Label Content="配列[0]" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
        <Label Content="配列[1]" HorizontalAlignment="Left" Margin="10,41,0,0" VerticalAlignment="Top"/>
        <Label Content="配列[2]" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top"/>
        <Label Content="配列[3]" HorizontalAlignment="Left" Margin="10,103,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="58,14,0,0" TextWrapping="Wrap" Text="なにか" VerticalAlignment="Top" Width="120" x:Name="Textbox0"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="58,44,0,0" TextWrapping="Wrap" Text="文字を" VerticalAlignment="Top" Width="120" x:Name="Textbox1"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="58,75,0,0" TextWrapping="Wrap" Text="入力" VerticalAlignment="Top" Width="120" x:Name="Textbox2"/>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="58,107,0,0" TextWrapping="Wrap" Text="してみて" VerticalAlignment="Top" Width="120" x:Name="Textbox3"/>
        <Button Content="書き換える" HorizontalAlignment="Left" Margin="58,139,0,0" VerticalAlignment="Top" Width="90" Click="Button_Write" />
        <Label Content="配列名" HorizontalAlignment="Left" Margin="197,10,0,0" VerticalAlignment="Top" x:Name="Label_array0" Height="27"/>
        <Label Content="配列名" HorizontalAlignment="Left" Margin="197,41,0,0" VerticalAlignment="Top" Height="26" x:Name="Label_array1"/>
        <Label Content="配列名" HorizontalAlignment="Left" Margin="197,72,0,0" VerticalAlignment="Top" Height="27" x:Name="Label_array2"/>
        <Label Content="配列名" HorizontalAlignment="Left" Margin="197,107,0,0" VerticalAlignment="Top" Height="27" x:Name="Label_array3"/>
        <Button Content="表示" HorizontalAlignment="Left" Margin="161,139,0,0" VerticalAlignment="Top" Width="90" Click="Button_Show"/>
    </Grid>
</Window>

続いてロジックを実装します。

MainWindow.xaml.cs
using System.Windows;
using System.Collections.Generic;

namespace _006_連想配列
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        //連想配列にテキストボックスの情報を書き込む
        static void Array_Write()
        {
            //Textbox は MainWindow に存在するのでインスタンス化する必要がある。
            //インスタンスを取得した上でその中の TextBox を使う
            var mainWindow = (MainWindow)App.Current.MainWindow;

            //連想配列は Dictionary<> を用いる
            //<配列の名前, 配列に入れるデータ>の各型を宣言する
            var array = new Dictionary<string, string>();

            //キーを個別に保管しておくための配列(変換する)
            string[] key = new string[4];

            //値を個別に保管しておくための配列(変換する)
            string[] value = new string[4];

            //foreach を回すための初期値
            int i = 0;

            //各要素に配列名とそこに入れるデータを参照する
            array.Add("配列1", mainWindow.Textbox0.ToString());
            array.Add("配列2", mainWindow.Textbox1.ToString());
            array.Add("配列3", mainWindow.Textbox2.ToString());
            array.Add("配列4", mainWindow.Textbox3.ToString());

            //array のキーの数だけ繰り返して、キーを個々に格納
            foreach(string Key in array.Keys)
            {
                key[i] = Key;
                i++;
            }

            //ウィンドウの配列名のところに設定した配列名が更新される
            mainWindow.Label_array0.Content = key[0];
            mainWindow.Label_array1.Content = key[1];
            mainWindow.Label_array2.Content = key[2];
            mainWindow.Label_array3.Content = key[3];
        }

        private void Button_Write(object sender, RoutedEventArgs e)
        {
            //連想配列へ書き込む
            Array_Write();
            MessageBox.Show("書き込みました");
        }

        private void Button_Show(object sender, RoutedEventArgs e)
        { 
            MessageBox.Show("配列名 " + Label_array0.Content + " には " + Textbox0.Text + " が代入されています。");
            MessageBox.Show("配列名 " + Label_array1.Content + " には " + Textbox1.Text + " が代入されています。");
            MessageBox.Show("配列名 " + Label_array2.Content + " には " + Textbox2.Text + " が代入されています。");
            MessageBox.Show("配列名 " + Label_array3.Content + " には " + Textbox3.Text + " が代入されています。");
        }
    }
}

このアプリは MainWindow画面の Textbox で受け取ったデータを Dictionaly で宣言した連想配列に書き込みます。
連想配列名は"配列1"になっていますが、ここを書きかえればKeyの値(各配列の名前)が変わります。このプログラムでは array[0] を配列1、array[1] を配列2 ...というように各配列に名前を付けています。
受け取ったデータを、Button_show にて Key と関連付けて Value が表示されます。

ぜひ実行してみてください。

プログラムの実行

まずはテキストボックスに好きな文字を入力します。
2019-05-28 (2).png

"書きかえる" をクリックすると、Button_Write イベントが実行され、Array_Write 関数によって連想配列に Value が書き込まれます。
2019-05-28 (1).png
書き込まれるとメッセージボックスが表示され、配列名の部分の表示がロジックで設定した Key が代入されます。
2019-05-28 (2)_LI.jpg

"表示" をクリックするとメッセージボックスにて、各配列の Key と Value の値がどのように関連付けられているかを確認することができます。
2019-05-28 (3).png

ここまでが一連の動作です。あとはロジック側で Key をいじってみると配列名が変わるのでいろいろ試してみると面白いと思います。
作ったものはこちらです。

最後に

たまたま配列の各要素に名前を付けたいと思っていたら Dictionary インスタンスについての記事が見つかりました。
参考 : https://www.sejuku.net/blog/41326
これをコンソールアプリではなく、Windowsアプリとして扱いたいと思って作ってみました。もし、使う機会があるとするならば、オブジェクト1つに対して様々なデータを含ませるときに使うかなと思います。(だったらクラスでもいい気が...)

皆様の参考になれば幸いです。


Viewing all articles
Browse latest Browse all 129

Trending Articles