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回





ディスカッション
コメント一覧
まだ、コメントがありません