繰り返しに使用される制御構文
繰り返しに使用される構文は4つです。
・for文(繰り返す回数が事前に分かっているとき)
・foreach文(配列やリストの要素を順番に処理していくとき)
・while文(繰り返す回数が分からないので、条件がtrueの間は繰り返す)
・do while(条件の判定がループ処理の最後なので、falseでもその回の処理は実行される)
繰り返し処理の中で、よく使われる予約語2つ
・continue(特定の条件を満たした時のループ処理をスキップ)
・break(特定の条件を満たした時にループ処理を終了)
今回はforeach文を学習していきます。
foreach文
foreachの基本的な書き方です
foreach (変数名 in コレクション))
{
//処理したい内容をここに記述
}
※コレクション:配列やリストを総称した呼び方
実際の数値を使ってサンプルコードを書いてみます。
string[] weeks = new string[]{ "月", "火", "水", "木", "金" };
foreach (string week in weeks)
{
Debug.Log(week);
}
上記のコードを実行すると、weeksという配列に格納されている要素の数だけ繰り返し処理が実行されます。ループ毎に前から順に要素が取り出されて変数 "week" に代入され、この値をコンソールに出力しています。
上記のサンプルコードをfor文で記述してみます。
//for文で同じ処理をしてみる
string[] weeks = new string[]{ "月", "火", "水", "木", "金" };
for (int i = 0; i < 5; i++)
{
Debug.Log(weeks[i]);
}
for文でも同じように宣言された変数から同じ結果を出力できました。コードをもう少し詳しくみてみると、上記のfor文で書いたコードの場合、配列データの要素数が固定さていればいいですが、要素数が変わった場合に全ての要素に同じ処理をすることができません。
配列データの全ての要素に繰り返し処理を行いたい場合はforeach文が便利です。
要素数が変わったとしても後からforeach文を修正する必要はなく、全ての要素に同じ処理ができるのが特徴です。
しかし、要素数が変化する場合でもfor文で対応できます。
string[] weeks = new string[] { "月", "火", "水", "木", "金" };
for (int i = 0; i < weeks.Length; i++)
{
Debug.Log(weeks[i]);
}
上記のコードでは配列の要素数を調べてfor文で使用しています。
このように記述することで要素数に合わせて繰り返す回数も決まるので汎用性が高くなります。
このようにシステムを拡張していくことで、ほとんどの繰り返し処理はfor文で組み立てることができる印象です。
しかし拡張していくほどコードが複雑になってしまいますので注意が必要です。
ここからはforeach文を使ったサンプルコードいくつかを書いてみます。
// 配列要素の合計値を計算
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
int sum = 0;
foreach (int number in numbers)
{
sum += number;
}
Debug.Log(sum);
// 配列から"都"を含む要素を抽出
string[] names = new string[] { "大阪府", "京都府", "東京都", "神奈川県", "千葉県"};
string str = "都";
foreach (string name in names)
{
if (name.Contains(str))
{
Debug.Log(name);
}
}
// リスト要素を別のリストに追加
List<int> numbers1 = new List<int>() { 1, 2, 3, 4, 5 };
List<int> numbers2 = new List<int>() { -3, -2, -1, 0};
foreach (int number in numbers1)
{
numbers2.Add(number); //リストの最後に要素を追加
}
foreach (int n in numbers2) Debug.Log(n); //更新された要素の確認
for文の汎用性が高いので、どのサンプルコードもfor文で書き換えできそうではありますが、配列やリストのデータに含まれる全ての要素に対して繰り返し処理を行う場合はforeach文で記述した方がシンプルに記述できます。
今回は使用しましませんでしたが、foreach文でもループのスキップ(continue)やループの終了(break)を使うことができます。