前回まで、配列と List(データのまとまり)をやりました。

今回は、そのまとまりの中身を、もっとラクに全部取り出す方法。foreach(フォーイーチ)です。

foreach とは、「まとまりの中身を、ひとつずつ、最後まで取り出す」くり返しです。

for文の、ちょっと面倒なところ

前回まで、配列やListの中身を全部取り出すのに、for文を使っていました。

int[] scores = { 80, 95, 70 };

for (int i = 0; i < scores.Length; i++)
{
    Console.WriteLine(scores[i]);
}

これでちゃんと動きます。でも、よく見ると、やりたいことに対して書くことが多いんです。

本当にやりたいのは「中身を順に表示する」だけ。なのに、

  • カウンター i を用意して
  • i < scores.Length で条件を書いて
  • i++ で増やして
  • scores[i] で番号を指定して取り出す

カウンターの管理が、地味に手間です。そして第11回で書いたように、番号を1つ間違えるとエラーになる危険もあります。

foreach なら、こう書ける

同じことを foreach で書くと、こうなります。

int[] scores = { 80, 95, 70 };

foreach (int score in scores)
{
    Console.WriteLine(score);
}

実行結果は、for文のときと同じ。80・95・70 が順に表示されます。

でも、書く量がぐっと減りました。カウンターも、番号も、個数も出てきません。

形を見てみましょう。

foreach (int score in scores)

これは、「scores の中身を、ひとつずつ score に取り出して、最後までくり返す」という意味です。

  • scores … 取り出したいまとまり
  • score … 取り出した中身を、一時的に入れる箱
  • 1回ごとに、score に 80 → 95 → 70 と順に入る

「中身を、頭から順に、最後まで」。それだけを、シンプルに書けます。

何が嬉しいのか

foreach の良いところは、番号を気にしなくていいことです。

for文では「0から始まる」「最後は個数マイナス1」と、番号の管理に気を使いました。番号をはみ出すとエラーにもなりました。

foreach は、「全部、順番に」やってくれるので、その心配がありません。「中身を全部、順に処理したい」だけなら、foreach の方が安全で読みやすいんです。

List でも、まったく同じように使えます。

List<string> names = new List<string>();
names.Add("山田");
names.Add("田中");

foreach (string name in names)
{
    Console.WriteLine(name + "さん");
}

for文と foreach、どう使い分けるか

ここが大事なところです。

  • foreach … 中身を 全部、順番に 処理したいとき。番号は気にしない
  • for文番号そのものを使いたいとき。「3番目だけ」「逆順で」「1個飛ばしで」など

たとえば「全員の点数を表示」なら foreach で十分。
「奇数番目だけ」「後ろから」のように、番号を細かく操作したいならfor文。

ふだんは foreach、番号で細かい操作がしたいときだけ for文。そんな使い分けが自然です。

つまずきポイント

foreach で注意したいのは、取り出した中身を書き換えても、元のまとまりは変わらないことです。

int[] scores = { 80, 95, 70 };

foreach (int score in scores)
{
    score = score + 10;   // score を増やしても…
}
// scores の中身は、80・95・70 のまま!

score は、あくまで「一時的に取り出したコピー」を入れる箱です。それを書き換えても、元の scores には影響しません。

「foreach は、見る(読む)のは得意。でも、書き換えるのは苦手」。中身を書き換えたいときは、for文と番号を使う。そう覚えておきましょう。

まとめ

foreach は、まとまりの中身を、頭から順に全部取り出すくり返し。

foreach (int score in scores)
{
    Console.WriteLine(score);
}
  • 番号を気にせず、全部を順に処理できる
  • 「全部見る」なら foreach、「番号を操作する」なら for文
  • 取り出した中身を書き換えても、元は変わらない

次回は、名前をつけてデータを引ける Dictionary(辞書) を紹介します。