foreach文とは?
foreach文とは、for文のようにループする条件やインデックスの指定をせず、Listや配列の中身を全件文ループする場合に使用します。
foreach文の書き方
foreach(データ型 反復変数 in コレクション)
{
}
データ型はコレクションの中に含まれている型、またはvarを記述します。反復変数には、ループ処理のときのみ使用する変数名を記述します。コレクションはListや配列など、ループさせるコレクションを記述します。
for文との違い
for文はループ内でインデックスを指定するため、インデックスの境界外エラーが発生する可能性がありますが、foreach文はコレクションの間中ループし、ループ中のターゲットは反復変数に格納されるため、インデックスを指定する必要がないため、インデックスの指定を間違えるエラーが発生しません。コレクションを全件ループさせる場合は、for文よりforeachのほうが適しています。
注意点
foreachでループさせている間に、コレクションの値を変更するとエラーになります。foreach内で値を変更させることはできません。変更する場合はfor文を使用しましょう
サンプルコード
namespace CS14 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { List items = new List(); items.Add(10); items.Add(20); items.Add(30); items.Add(40); foreach (var item in items) { MessageBox.Show(item.ToString()); } } private void button3_Click(object sender, EventArgs e) { List items = new List(); items.Add(10); items.Add(10); items.Add(30); items.Add(40); //この記述はバグっています。 //リスト内を削除する場合はbutton4_Clickの逆回しで削除してください for (int i = 0; i < items.Count; i++) { if(items[i] == 10) { items.RemoveAt(i); } } } private void button4_Click(object sender, EventArgs e) { List items = new List(); items.Add(10); items.Add(10); items.Add(30); items.Add(40); items.Add(10); items.Add(10); for (int i = items.Count - 1; i >= 0; i--) { if (items[i] == 10) { items.RemoveAt(i); } } } } }
for文でコレクションの中身を削除する場合は注意が必要です。button3_Click順回しでループしながら削除すると、途中でインデックスがずれでバグが生じます。button4_Click のように逆回しでループさせて削除することで、インデックスのずれが生じません。