🐣 C# 学習6日目 配列 多次元配列
作成日: 2023/01/14
0

C# 学習6日目 -1- 配列 多次元配列

昨日は一次元配列を学習しました。
本日は多次元配列。

二次元配列

int[,] array = new int[5, 3];

これは5行3列の二次元配列を作ります。
intの後の[と]の中に ,(カンマ)が一つ入るのが特徴的です。
値を設定しているところと同じ形です。

三次元配列

int[,,] array1 = new int[8, 8, 3];

これは8x8x3の三次元配列を作ります
こちらもintのところの ,(カンマ)が一つ増えていますが
値を設定しているところと同じ形ですね。

こんな書き方もできるそうです

int[,] array2D = new int[,] { { x1, y1 }, { x2, y2 }, { x3, y3 } };
int[,,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } },
                                 { { 7, 8, 9 }, { 10, 11, 12 } } };

残念ながらC#の多次元配列は取り回しが悪い気が…

検索方法や配列の取り回し方法をネットで調べたのですが、
1次元配列は良いのですが、多次元配列は
「forとかで何度も回せ」みたいなのしかなく、
なるべく多次元配列は使わないほうがいいという結論になりました。

C#なら代わりにLINQを使いましょう

色々と調べていたら、
C#なら代わりにLINQを使いましょうという事らしいです。
今回は配列を学習する回なので、LINQそのものを扱いませんが
(というより、学習がそこまで到達していません)、
LINQを使うためのデータとして、varを使ったデータのオブジェクトを
作って扱えるようです。
(ここで var が出てくるのか・・・)
学習がLINQまで到達していませんが、本の先のほうまで飛ばし読みして、
LINQのサンプルとして次のようなものがありました。

        var 車表 = new[] {
            new{番号= 2, 名前 ="乗用車"},
            new{番号= 3, 名前 ="オープンカー"},
            new{番号= 4, 名前 ="トラック"},
        };

        IEnumerable qry = from K in 車表
                          select new { K.名前, K.番号 };

配列名などが「車表」だったり、漢字で書かれているのは、
「さすがWindowsプログラム」「情報処理試験みたい」 
と感じてしまうのは、置いておいて・・・
LINQはまったく習ったことないのに、これだけみて、
なんとなく分かったような気になれるのはLINQすごそうです。
これなら扱いやすそう!

楽しみは、残しつつ・・・
今回は、多次元配列の学習ですので、
二次元配列のデータをラベルに表示するサンプルを実行してみました。

二次元配列の演習

[キャラの役名, 英語の役名, キャラの名前] の順に並んだデータ、
4レコード分をフォームのラベルに表示します。

ソースコード

using System.Windows.Forms;

class Sample8
{
    public static void Main()
    {
        
        //2次元配列
        Form fm = new Form();
        fm.Text = "配列のサンプル";
        fm.Width = 250; fm.Height = 100;

        // 配列設定 [,]のようにカンマが要るのに注意
        string[,] str = new string[4, 3]{
            {"主人公", "Hero", "勇者太郎"},
            {"敵","Enemy","鉄魔人"},
            {"姫", "Princess", "舞姫"},
            {"ボスキャラ", "Boss", "大魔人ジャンボ"}
        };

        Label lb = new Label();
        lb.Width = fm.Width;
        lb.Height = fm.Height;

        string tmp = "";


        for (int i = 0; i < 4; i++)
        {
            tmp += "|";
            for (int j = 0; j < 3; j++)
            {
                tmp += str[i, j];
                tmp += "|";
            }
            tmp += "\n";
        }

        lb.Text = tmp;
        lb.Parent = fm;

        Application.Run(fm);
    }

実行結果

sampleArray.png

まとめ

あくまで学習中の初心者の今の段階でのまとめになりますが、
2次元配列など多次元配列は扱いにくいと思いました。
1次元配列は配列用のオブジェクトメソッドがあったりするのですが、
1次元配列の代わりにListを使うこともできるので、
配列自体、C#ではあまり使わないだろう と推測しています。

この早い段階で、そこに気づけたのは良かったと思いました。

おそらく、後のほうになりますが、ListLINQを学習するのも
楽しみになってきました。


これからゲームアプリとWindowsアプリを作りたい初心者です。 ゲームアプリとWindowsアプリ、共に経験ゼロです。 これからの体験が少しでも参考になれば幸いです。 目指す事 ・C言語学習→C#学習 ・Unity (C#) の勉強 ・Unityゲーム作成 ・Windowsアプリ(C#) 作成