【C#】配列とかコレクションについて

 

最近配列とかコレクション(主にリスト)に関して、少し勉強したのでそれについての復習と記録をしておきます。

 

基本的な使い方とよく使う便利な使いかたなどです。

1次元配列の使いかた

 

基本的な使いかたの説明です。

 

ちなみにこれを実行すると、a[10] = 10のところでエラーが起きて、「ハンドルされていない例外: System.IndexOutOfRangeException: インデックスが配列の境界外です。」とでます。

 

配列が絡むプログラムを組むといつもでるエラーなので、見慣れてしまっています。気を付けてはいるんですがねぇ…

 

宣言とインスタンス作成は同時にすることもできます。(たいていはこうやって書くことが多いです。)

 

また、C言語ではできなかった[]の中に変数を入れるということもできてしまいます。

なので、ユーザーに配列の要素数を入力してもらって、任意の要素数を決めることもできます。C言語では、[]に入れられるのは整数のリテラル(1とか10とかの数字)だけで、あらかじめ大きな要素数書いておかなけらばいけなかったので、これはとても役に立っています。

 

ただ、入れられることができる変数は、値がすでに決まっている変数のみです。値が決まっていない変数を入れるとエラーになります。

上のようなコードを書くと、配列aのインスタンスが作成されるときにnの値が決まっていないのでエラーになります。この順序関係だけは注意が必要です。

 

最初に配列を書くと自分で値を指定しない限り、それぞれのデータ型によって適当なデフォルト値で初期化されます。

 

例えば、上のようにint型だと最初は0に、char型なら\0に設定されるようです。(\0は実行すると空白のように見えますが、あくまで\0です)

 

2次元配列の使い方

 

2次元配列はそのまま、「配列の中に配列などが入っている」構造をもつ配列です。

 

配列の中に配列が入っていれば2次元配列、配列の中に配列が入っていて、その配列の中にさらに配列が入っているのが3次元配列です。以降は4次元、5次元となっていきます(ややこしい)。

 

宣言するときは、1次元配列の宣言の仕方とほとんど変わりません。

[ ] の中を「 , 」でくぎることで2次元を表すことが出来ます。

 

Listの使いかた

 

Listを使うことで動的にメモリを確保しながら値を保存することができます。「動的にメモリを確保」とは要は、保存する値の数をあらかじめ決めておく必要がなく、増えた分だけ自動的に増やしていってくれるということです。

 

 

今まではこういった「配列にどれだけの値が入るかがわからない」という場合は、なるべく大きな値をあらかじめ予想して設定することで、解決できていました。しかし、これだと余分に余った領域を無駄にしてしまいます。

 

しかし、リストはAddメソッドによって値を挿入することで、その場でメモリをインデックス領域を作り出して全体の配列要素を増やしてくれます。

 

なので、どれだけの数の値が入るのかがわからないときは、リストを使うことで必要な分だけのメモリを確保するのがいいということです。

 

リストは<>のなかに任意のデータ型を入れることができるので、List<string>、List<double>なども当然できますし、List<List<>>のようにListの中にListをいれるということもできます。

 

 

簡単なList<List<int>>の例です。

実際に入れるデータがリストになっただけなので、先ほどのリストとほとんど同じように見えます。

 

しかし、foreachを使う際は中に入っているのが単純な値型のデータでなく、リスト型なので最初のforeachでのk1は、List<List<int>>型のsの要素、つまりList<int>型のデータです。

 

なのでもし、pの中の要素を確認したいと思ったら、foreachを2重にかけてやれば求めることができます。

 

ただし、リストはAddで追加したインデックス領域にしかアクセスることができません。

上のように、Addして初めてリストのインデックス領域が確保されるので、作られていないインデックス領域にアクセスしてもエラーになります。(一度Addメソッドでインデックス領域を確保すれば作った分の領域へは任意にアクセスできます)

 

他にもリストには、自動的にソートするSortメソッドや配列に変換するToarrayメソッドなどがあり、実際に使ってみてもかなり使い勝手がいいです。

 

私もまだまだ使いこなせていないので、使いながらぼちぼち覚えていくつもりです。

 

コメント