コレクションの「反復処理」
C#で配列(string[]など)やList<T>といった「コレクション」(データの集まり)を扱う際、その中身(要素)を先頭から順に一つずつ取り出して、何らかの処理を行いたい(例: 画面に表示する、合計値を計算する)という操作は、プログラミングの基本です。
forループとインデックス(i)を使って myArray[i] のようにアクセスする方法もありますが、C#にはこの「反復処理」をより安全かつ直感的に記述するための foreach ループ構文が用意されています。
foreach ループの基本構文
foreach ループは、コレクション内の要素の数だけ自動的に繰り返し処理を行います。インデックス(0から始まる番号)やコレクションの総数(Length)を意識する必要がありません。
基本構文:
foreach (var [一時変数] in [コレクション変数])
{
// コレクション内の各要素([一時変数])を使った処理
}
[コレクション変数]: 処理したい配列やList<T>など。var [一時変数]: コレクションから取り出された現在の要素が、ループの各回でこの変数に自動的に格納されます。
コード例1:配列(string[])の反復処理
string型の配列(userNames)に含まれる全ての名前を、順番にコンソールに出力する例です。
using System;
public class ForeachArrayExample
{
public static void Main()
{
// 処理対象の文字列配列
string[] userNames = { "Alice", "Bob", "Charlie", "David" };
Console.WriteLine("--- 登録ユーザー一覧 ---");
// foreach ループで userNames 配列を処理
// "Alice", "Bob", "Charlie", "David" が順番に 'name' 変数に格納される
foreach (var name in userNames)
{
Console.WriteLine($"ユーザー名: {name}");
}
}
}
出力結果:
--- 登録ユーザー一覧 ---
ユーザー名: Alice
ユーザー名: Bob
ユーザー名: Charlie
ユーザー名: David
コード例2:リスト(List<int>)の反復処理と計算
foreachループは、配列だけでなくList<T>など、IEnumerable<T>インターフェースを実装するほとんどのコレクション型で使用できます。
List<int>(整数のリスト)の全要素を処理し、その合計値を計算する例です。
using System;
using System.Collections.Generic;
public class ForeachListExample
{
public static void Main()
{
// 処理対象の List<int>
var scores = new List<int> { 100, 85, 92, 78 };
int sum = 0;
// scores リストの各要素 (score) でループ
foreach (var score in scores)
{
sum += score; // 合計に加算
}
double average = (double)sum / scores.Count; // Count で要素数を取得
Console.WriteLine($"--- スコア集計 ---");
Console.WriteLine($"合計点: {sum}");
Console.WriteLine($"平均点: {average:F1}"); // F1: 小数点以下1桁
}
}
出力結果:
--- スコア集計 ---
合計点: 355
平均点: 88.8
foreach の利点と注意点
利点
- 可読性:
for (int i = 0; ...)よりも「コレクションの各要素について処理する」という意図が明確で、コードが読みやすくなります。 - 安全性: インデックス(
i)を直接扱わないため、myArray[i + 1]のような記述ミスによる「IndexOutOfRangeException」(配列の範囲外アクセス)エラーを防ぐことができます。
注意点(読み取り専用)
foreachループ内で使用される一時変数(nameやscore)は、**読み取り専用(Read-only)**として扱われます。
foreach (var score in scores)
{
// score = 100; // コンパイルエラー!
}
このループ変数を介して、コレクションの要素を直接変更(再代入)することはできません。もしコレクションの要素を書き換えたい場合は、forループを使用する必要があります。
まとめ
foreachループは、C#において配列やリストなどのコレクションに含まれる全ての要素に対して、順番に何らかの処理を行うための、最も標準的で安全な方法です。
インデックス管理の煩わしさから解放され、コードの可読性を高めることができるため、コレクションの全要素を単純に読み取る場合はforループよりもforeachループの使用が推奨されます。
