はかせのラボ

私の頭の中を書いていく雑記ブログです

C# 配列というものについてそれとなく語る ~闇が深そうなコードを添えて~

あいさつ

どうも、はかせです。

最近学校でもネット上でも
「配列の扱いを知らない人」が多いように感じます。
(あくまで自分の目に見えている範囲だけの話ですが)

そこで今回は「配列を知らないorよくわかってない人」向けに
「配列とは何ぞや」っていうのを書いていきます。

なおC#はサンプルコード等で使うだけです。
C#特有の配列機能(LINQとか)は扱いません。

配列とは

プログラミングにおける配列っていうのは
「複数の同じ型のデータを
ひとまとめにして扱うもの」

です。
要はデータの集まりです。

C#で書くとこんな感じ

int[] intArray;
intArray = new int[10];

使い方は基本的な変数とかと同じで
・変数と型宣言
・宣言した変数に宣言した型の実体を代入する

配列宣言は1行目です。
C#では型名[]で配列型を宣言できます。
そして実体代入は2行目。
ここもnewで確保した実体を代入しているだけです。

配列のイメージはこんな感じ
f:id:hakase0274:20191105170538p:plain

intArrayというものの中には
0~9まで割り振られた
int型のデータが入っている感じです。

例としてintを使いましたが、
型はintである必要はありません。
stringでもdoubleでも
なんなら自作のクラスや構造体だってOKです。

配列はあくまで
複数の同じ型のデータをひとまとめにして扱うものです。
それ以上でも以下でもありません。

それを助ける機能が付いていたり、
より性能を追い求めたりしているものはありますが、
考え方の根っこは変わりません

配列が便利な場面

さて配列の基本の「き」的な所を書いたところで
実際配列の何が強いんだって話をしましょう。

よくあるあるな例ではありますが、
合計値と平均値でやりましょう。

まず配列が無い場合の合計値、平均値はこんな感じですかね。

int one = 1;
int two = 2;
int three = 3;
int four = 4;
int five = 5;
int six = 6;
int seven = 7;
int eight = 8;
int nine = 9;
int ten = 10;

int sum = one + two + three + four + five + six + seven + eight + nine + ten;
float ave = (float)sum / 10;

全部手打ちかつ、マジックナンバーのオンパレードですね・・・
速度を追い求めてとかそういう場面じゃない限り
極力書きたくないコードです。

では次に配列を使った版

int[] intArray = new int[10];

for(int i = 0;i < intArray.length;i++)
{
    intArray[i] = i + 1;
}

int sum = 0;

for(int i = 0;i < intArray.lenth;i++)
{
    sum += intArray[i];
}

float ave = (float)sum / intArray.lenth;

全部手打ちでやっていた変数宣言が全て
プログラムで自動化されマジックナンバーも最小限になりました。
実際配列の要素数を指定する値も変数にできるので
やろうと思えばマジックナンバーを完全駆逐することもできます。

(。´・ω・)ん?
別に配列でやってもやらなくても大差ないんじゃないかって?
じゃあこの値の数を1000個にしてみましょうか♪

コードの長さが中々に頭おかしいことになってるので
折りたたみました。
(実は折りたたむの初めて)

見る方は覚悟をしたうえでご覧ください。

見てくれた方はいますかね?(行数1003)
全部見なくてもほとんど全部同じコードなので
頭だけ見てたたんでいただいても構いません。

見たくないと思った方、正常な感覚ですのでご安心ください。
書いておいてなんですが私もこんなコード見たくありません

やってることはほぼ全て宣言と足し算割り算です。
ただそれだけのためにこれだけのコードを書く羽目になりました。
配列使わないとこうなっちゃう可能性が大いにあるわけです。

ではこれを配列有でやるとどうなるか。

int[] intArray = new int[1000];//ここを10→1000にするだけ

for(int i = 0;i < intArray.length;i++)
{
    intArray[i] = i + 1;
}

int sum = 0;

for(int i = 0;i < intArray.lenth;i++)
{
    sum += intArray[i];
}

float ave = (float)sum / intArray.lenth;

素数の宣言を変えるだけで同じことができます。
わざわざあんな見るだけでうんざりするようなコードを書く必要ありません。
配列を使えば宣言を少し弄るだけで要素数の変更に対応できます。
逆に配列を使ってないと扱う値の数が1万とかなった日には・・・・
あとはご想像にお任せします。

あとがき

今回は配列の基本とその有用性についてでした。

とにかく
配列使ったら楽になるんだなと言うのと、
配列無しだったら血反吐吐く思いをする
可能性が有るということだけでも
わかっていただけたら私の労力は報われます。

ちなみに1000とか値使わないよとか思っているそこのあなた。
モデルの表示をするだけで頂点数が1万とか平気で行きますからね?
1000程度意外とさっくりと使いますからね?
(実際自分の知人に配列でやればいいところを逐一変数でやってて
コード行数が1000とかいってる人がちらほら・・・)

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ