C# の foreach を配列の合計と平均を作りながら理解する

C# には、配列(またはコレクション)の要素を 先頭から順に取り出して処理する ための foreach 文があります。

まずは次のコードを見てください。

// ■リスト6-6:foreach文で配列の各要素にアクセスする(1)
var scores = new int[] { 65, 54, 78, 96, 81 };

var total = 0;

foreach (var p in scores)
{
    total += p;
}

var average = (double)total / scores.Length;

Console.WriteLine("平均点: {0}", average);

このコードは、点数配列 scores の 合計と平均点 を求めています。


foreach 文は「配列の中身を順番に取り出す」構文

foreach の基本形は次の通りです。

foreach (要素を入れる変数 in 配列)
{
    繰り返したい処理
}

今回の例では

foreach (var p in scores)

の意味は次の通りです。

  • scores の中身を1つずつ取り出す
  • 取り出した値を p に入れる
  • ブロック内の処理を繰り返す

実際の動きを手で追う

scores の中身:

  • 65
  • 54
  • 78
  • 96
  • 81

ループの流れ:

1回目 → p = 65 → total に加算

2回目 → p = 54 → total に加算

3回目 → p = 78 → total に加算

4回目 → p = 96 → total に加算

5回目 → p = 81 → total に加算

結果として total は全要素の合計になります。


foreach の利点(for との違い)

foreach は添字を扱いません。

for の場合

  • i を管理
  • 範囲条件を書く
  • scores[i] でアクセス

foreach の場合

  • 要素を直接取得
  • 記述が短い
  • 意図が明確

初学者には

「配列の中身を全部見るときの基本構文」

として非常に読みやすいです。


平均計算とキャストの理由

var average = (double)total / scores.Length;

ここで (double) を付けないと:

total / scores.Length

整数同士の割り算になり、小数が切り捨てられます。

そのため

  • total を double に変換
  • 小数計算へ切り替え

しています。


追記:変数 p は命名として適切とは言いにくい

foreach (var p in scores)

動作上は問題ありませんが、教材や実務では改善余地があります。

問題点

  • 意味が不明確
  • 読み手が推測する必要がある
  • 保守性が低い

教育コードでは

読みやすさ=理解速度

なので重要です。


改善例(推奨)

foreach (var score in scores)
{
    total += score;
}

理由:

  • 複数形 → 単数形の自然な対応
  • 意味が明確
  • 初学者理解に最適

教材向け最終コード

var scores = new int[] { 65, 54, 78, 96, 81 };

var total = 0;

foreach (var score in scores)
{
    total += score;
}

var average = (double)total / scores.Length;

Console.WriteLine("平均点: {0}", average);

訪問数 23 回, 今日の訪問数 23回

C#,繰り返し

Posted by hidepon