ヒント
この記事は、少なくとも 1 つのプログラミング言語を既に知っており、C# を学習している開発者向けの 基礎 セクションの一部です。 プログラミングを初めて使用する場合は、最初に「 はじめ に」チュートリアルから始めてください。 完全な構文については、言語リファレンスの 反復ステートメント を参照してください。
別の言語から来ていますか? 4 つの C# ループ (foreach、while、do-while、for) はすべて、Java、C++、および JavaScript に直接対応します。
foreachを最も頻繁に使用します。 Javaの拡張forや JavaScript のfor...ofなど、インデックスなしでコレクションを反復処理します。
反復ステートメントは、コードのブロックを繰り返し実行します。 ブロックを通過する各パスは イテレーションであり、繰り返しブロックは ループです。 C# には 4 つのループが用意されています。 コレクションの foreach から始め、条件が繰り返しを制御する場合は while と do-while を使用し、明示的なインデックスが必要な場合は for を使用します。
foreach を使用してコレクションを反復処理する
foreach ステートメントは、コレクション内の各要素の本文を順番に 1 回実行します。 インデックスや境界チェックを管理しないため、コレクションを読み取るための最も一般的な選択肢です。
foreach ステートメントは、一般的な 1 回ごとのエラーを防ぎます。
string[] names = ["Ana", "Ben", "Cleo"];
// foreach reads each element in order. It's the default loop for
// collections: no index to manage and no off-by-one mistakes.
foreach (string name in names)
{
Console.WriteLine(name); // => Ana, then Ben, then Cleo
}
foreach は、配列、 List<T>、 Dictionary<TKey,TValue>など、C# がシーケンスとして認識する任意の型で動作します。 繰り返し変数 (前の例でname ) は読み取り専用であるため、ループ内で再割り当てすることはできません。
ループの本体は、代入やメソッド呼び出しなどの単一 のステートメントです。
ブロック ステートメント自体は、0 個以上のステートメントを中かっこ ({ }) で囲む単一のステートメントです。
多くのコーディング規約では、文が1つだけの場合でも、ループ本体を中括弧で囲むことを推奨しています。 中かっこで範囲を明示的にします。 これはよくある間違い、つまり後から2行目を追加してそれが各反復で実行されると思っていたのに、実際にはループの後で1回だけ実行されてしまうというミスを防ぎます。 ループに含まれる文を決めるのは、中括弧だけです。 C# は空白を重要なものとして扱わないので、インデントだけでは決して行われません。 中かっこは内容が 1 行であっても正式: ブロックはループが繰り返される単一のステートメントです。 コードにインデントをつけると読みやすくなりますが、ブロックを定義するには中かっこを頼みにしてください。
条件が成立している間、繰り返す while
while ループは、各イテレーションの前にブール条件をチェックします。 開始時に条件が false 場合、本文は実行されないため、 while ループは 0 回以上実行されます。
int countdown = 3;
// A while loop checks its condition before each iteration, so the body
// runs zero or more times.
while (countdown > 0)
{
Console.WriteLine(countdown); // => 3, then 2, then 1
countdown--;
}
ループ内の何かが条件を変更することを確認します。 前の例では、 countdown-- 最終的に条件を falseします。 条件が決して false にならないループは、無限に実行されます。
do
-
while を使用して本体を少なくとも1回実行する
do
-
while ループでは、各イテレーションの後に条件がチェックされるため、本体は常に少なくとも 1 回実行されます。 入力を求めて検証するなど、条件を評価する前に最初のパスが発生する必要がある場合に使用します。
int attempts = 0;
// A do-while loop runs its body once, then checks the condition. Use it
// when the body must run at least one time.
do
{
attempts++;
Console.WriteLine($"Attempt {attempts}"); // => Attempt 1, then Attempt 2, then Attempt 3
}
while (attempts < 3);
for による数
for ループ ステートメントには、ループの前に 1 回実行される初期化子、各イテレーションの前にチェックされる条件、および各イテレーションの後に実行される反復子の 3 つの部分が含まれています。
forは、要素だけでなく、インデックス自体が必要な場合に使用します。 通常、要素の値を読み取るのではなく変更する場合は、インデックスが必要です。
// A for loop fits when you need an explicit index. The three parts are
// the initializer, the condition, and the iterator.
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i); // => 0, then 1, then 2
}
要素のみを読み取る場合、位置を使用しない場合や新しい値を割り当てない場合は、 foreachを優先します。 意図をより明確に示し、インデックスの算術演算を回避します。
breakで終了するか、continueでスキップします
2 つのジャンプ ステートメントを使用すると、任意のループ内を細かく制御できます。
break ステートメントはループを直ちに終了し、残りの反復はスキップされます。
int[] numbers = [2, 4, 7, 8];
// break stops the loop immediately, skipping any remaining elements.
foreach (int number in numbers)
{
if (number % 2 != 0)
{
Console.WriteLine($"First odd number: {number}"); // => First odd number: 7
break;
}
}
continue ステートメントは、現在のイテレーションの残りの部分をスキップし、次のイテレーションに進みます。
int[] values = [1, 2, 3, 4, 5];
// continue skips the rest of the current iteration and moves to the next.
foreach (int value in values)
{
if (value % 2 == 0)
{
continue; // skip even numbers
}
Console.WriteLine(value); // => 1, then 3, then 5
}
を使用して非同期ストリームを反復処理する await foreach
非同期ストリームは、非同期タスクを使用して次の各要素を生成するリーダーです。 C# は、 IAsyncEnumerable<T> インターフェイスでそれを表します。 Web API からのページやデータベースからの行など、時間の経過と同時に到着するデータは、このモデルに適合します。次の要素を取得することは、即時に返されるのではなく、待機可能な操作です。
非同期ストリームを使用するには、awaitの前に foreach キーワードを配置します。 各イテレーションは次の要素を待機するため、スレッドをブロックするのではなく、その要素が生成されている間ループが中断します。
private static async Task AwaitForeachExample()
{
// await foreach consumes an asynchronous stream. Each iteration can
// suspend while the next element is produced.
await foreach (int value in GenerateAsync())
{
Console.WriteLine(value); // => 0, then 1, then 2
}
}
private static async IAsyncEnumerable<int> GenerateAsync()
{
for (int i = 0; i < 3; i++)
{
await Task.Delay(1); // stand-in for real asynchronous work
yield return i;
}
}
非同期ストリームは、 async と awaitに基づいて構築されます。 完全なチュートリアルについては、「 非同期ストリームの生成と使用」を参照してください。
こちらも参照ください
.NET