C#初心者のための基礎!foreach文の書き方と使い方をわかりやすく解説#14

当サイトではアフィリエイト広告を利用しています。

C#初級プログラミング

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 のように逆回しでループさせて削除することで、インデックスのずれが生じません。