C#のListをUnity付属のMonoDevelopで使ってみる

記事内に広告が含まれています。

今回はC#のListを勉強していきたいと思います。

一連の同じ型のデータを扱う時は、配列を使うのが便利ですが、配列の場合は使用する前に使用する要素の数を指定する必要があります。

Listの場合は要素数をあらかじめ指定する必要がなく追加、削除が行えますので、用途によってはこちらの方が使い勝手が良くなります。

例えば、アクションゲーム等で主人公の半径5m以内にいる敵のゲームオブジェクトを取得したいといった時、

配列を使った場合主人公の5m以内に何人の敵が入るかわからない為、ある程度大きめの要素を確保しておいて要素数を越えないようにしておく必要がありますし、範囲内に敵が入ったら配列の空の要素を探し、そこに新しく入った敵を入れる。

敵が範囲外に出たら要素からその敵を探し削除するという作業が必要になります。

あらかじめ配列の要素が決まっている為、要素全てに敵が入るわけでもなく虫食いの状態になります。

リストを使った場合は敵の追加、削除を簡単に行えますし、要素数はその都度変わっていきます。

空の要素の事を考えなくて済むので楽ですね(^_^)v

スポンサーリンク

Listを使ってみる

今回使用するListはジェネリック版のリストを使っていきます。

ジェネリックについてはこちらで解説されています。

.NET のジェネリック
.NET のジェネリックについて説明します。 ジェネリックを定義して使用し、欠点と長所を理解し、クラス ライブラリと言語サポートなどを理解します。

リストに型の制限を加えて、他の型の値が入らないように出来るって感じですかね。

Listの宣言

まずはリストの宣言をしてみます。

↑のように型の部分を指定してリストの宣言が出来ます。

右辺は型が決まっているのでvarも使用出来ます。

実際に型を指定して宣言すると、

最初のリストはint型の値を入れるリストで、2番目のリストはstring型の値を入れるリストとなります。

UnityのGameObject型を入れるリストを作る場合は

等と型の部分をGameObjectに変更するだけです。

リストの初期化

リストも配列と同じような感じで初期値を設定する事が出来ます。

{}の中に要素を指定します。

リストに要素を追加する

リストに値を追加するには、Add、AddRange、Insert、InsertRangeがあります。

サンプルで使う為、あらかじめstringListとaddList変数を宣言しておきます。

Add

Addメソッドは要素の最後に値を追加する事が出来ます。

引数には追加する要素を書きます。

stringListの最後にtest3という文字列の要素が追加されます。

stringListは test1 test2 test3 という順番で格納されることになります。

AddRange

AddRangeメソッドはリストにコレクションクラス(配列やリスト等の複数のデータを扱うクラス)を追加する事が出来ます。

↑の例ではstringListの最後にaddListを追加します。

stringListは test1 test2 test4 test5 となります。

Insert

Insertメソッドは指定した要素番号の位置に要素を追加します。

↑の例では0番目の要素にinsertStringを追加します。

stringListは insertString test1 test2 となります。

InsertRange

InsertRangeメソッドは指定した要素番号の位置にコレクションクラスを追加します。

↑の例では1番目にaddListを追加します。

結果stringListは test1 test4 test5 test2 となります。

リストから要素を削除する

リストから要素を削除する時は、Remove、RemoveAt、RemoveAll、RemoveRange、Clearを使用します。

Remove

Removeメソッドを使うと、リストの中から該当する最初に見つかった要素を削除します。

これを実行するとstringListは test2 になります。

RemoveAt

RemoveAtメソッドを使うと、指定した要素番号の要素を削除します。

これを実行するとstringListは test2 となります。

RemoveAll

RemoveAllメソッドを使うと、リスト中から該当する要素が全て削除されます。

RemoveAllの引数にはPredicateデリゲートを指定します。

Pridicateデリゲートとはそのオブジェクトが条件を満たしているかどうか確認するメソッドらしいですが、よくわかりませんね・・・(^_^;)

Predicate Delegate (System)
Represents the method that defines a set of criteria and determines whether the specified object meets those criteria.

デリゲートはメソッド呼び出しの引数として渡す事が出来るので、メソッド自体を引数として渡している感じです。

上記の例ではラムダ式を使っていますが、ラムダ式はまだ記事を書いていないのでここでは省略しますが、

やっている事はリストの要素中にtestという文字列が含まれていればリストから削除するということです。

RemoveRange

RemoveRangeメソッドは第1引数で指定した要素番号から第2引数で指定した数分だけ要素を削除します。

↑の例では、0番目の要素から1つ削除します。

stringListは test2 となります。

Clear

Clearメソッドを使用するとリストに登録されている要素が全て削除されます。

↑の処理を行うとリストが空になります。

要素の取得方法

要素を操作する事は出来ましたが、取得する方法も必要になります。

配列と同じようにリスト名の後に[]を付けて要素番号を指定します。

↑の例では test1 が表示されます。

リストの中から条件にあったものを取得する

リストの要素の中から指定した条件に合致した要素を取得する方法も必要ですね。

BinarySearchを使う

BinarySearchメソッドを使うと条件に合致した要素の要素番号を取得出来ます。

↑の例では0がコンソールに表示されます。

IndexOf

IndexOfメソッドを使うと、条件にあった最初の要素の要素番号を取得する事が出来ます。

要素が見つからなかった場合は-1が返ります。

↑の例では-1が取得出来ます。

LastIndexOf

LastIndexOfは条件にあった最後の要素の要素番号を取得する事が出来ます。

↑の例では-1が取得出来ます(要素が見つからない為)。

Find

Findメソッドを使用すると引数でPredicateデリゲートを指定し、その条件に合致した最初の要素を取得出来ます。

↑の例ではtest1が取得出来ます。

FindIndex

FindIndexメソッドを使用すると引数でPredicateデリゲートを指定し、その条件に合致した最初の要素の要素番号を取得出来ます。

↑の例では0が取得出来ます。

FindLast

FindLastメソッドは引数でPredicateデリゲートを指定し、条件に合致した最後の要素を取得します。

↑の例ではtest2が取得出来ます。

FindLastIndex

FindLastIndexメソッドは引数でPredicateデリゲートを指定し、条件に合致した最後の要素の要素番号を取得します。

↑の例では1が取得出来ます。

FindAll

FindAllメソッドは引数でPredicateデリゲートを指定し、条件に合致した要素のリストを取得する事が出来ます。

↑の例では test1 test2 という要素を持つリストが返され、newListに入ります。

リスト中に条件にあった要素があるかどうか

Contains

Containsメソッドは引数で指定した要素があればtrue、なければfalseを返します。

↑の例ではtrueが返ります。

Exists

Existsメソッドは引数にPredicateデリゲートを指定し、その条件に合致しているかどうかを調べます。

↑の例ではtrueが返ります。

Containsとの違いは引数にPredicateデリゲートを指定するところです。

リストの要素数を調べる

リストの要素数を調べるにはCountメソッドを使用します。

↑の例では2が返ってきます。

リストを配列に変換する

リストを配列に変換したい時はToArrayメソッドを使用します。

↑ではstringListリストを配列に変換しnewArrayに入れています。

リストの要素を並べ替える

リストの要素を並べ替えるにはSortメソッド、Reverseメソッドを使用します。

Sort

Sortメソッドは引数に何も指定しなければデータを昇順に並べ替えます。

↑を実行するとリストは test1 test2 の順番になります。

Sortの引数に比較メソッドを指定し、並び順を変更する事も出来ます。

まずは以下のような比較メソッドを用意します。

↑の場合は文字列の長さで並び順を変えますが、第2引数側から第1引数側を引いている為、文字列が長い順に並び変えます。

戻り値で0より小さければそちらが前、0なら同じ、0より大きければ後ろになります。

SortでこのCompareメソッドを指定すると

となり、stringListの並び順は test2 test1 となります。

Sortに関しては

List.Sort メソッド (System.Collections.Generic)
IComparer の指定した実装または既定の実装を使用するか、リストの要素を比較する指定した Comparison デリゲートを使用して、List の要素または要素の一部を並べ替えます。

こちらに詳しく載っています。

Reverse

Reverseメソッドを使うとリストを降順に並べ替える事が出来ます。

↑を実行するとstringListは test2 test1 となります。

最後に確認する

最後にこれまでの処理を色々詰め込んだサンプルを作成したので、実行して確認してみます。

コメントも入れてあるので順に追ってみてください。

実行結果は

Listのサンプルの実行結果

↑のようになります。

実行結果が多すぎて切り取れなかった為、最初の1番目の要素、2番目の要素部分はありません。

終わりに

Listの全部ではないですが、細かいメソッドまで見ていったのでだいぶ長い記事になりました。

ここまで細かくメソッドを追うつもりはなかったんですが、自分の確認用に色々載せておきました・・・・(^_^;)

すぐに忘れてしまいますので・・・・(T_T)

タイトルとURLをコピーしました