ループ処理における「スキップ」の必要性
C#でfor、foreach、whileなどのループ(繰り返し処理)を実装する際、特定の条件に合致した場合にのみ、その回(イテレーション)の処理を中断し、すぐに次の繰り返しに進みたいというケースがあります。
例えば、リスト内のデータを処理中、特定の値(例: エラーデータや処理不要なデータ)を発見した場合、その後の処理をすべてスキップして次のデータに移りたい、といった状況です。
このような制御を実現するために使用されるのが continue キーワードです。
continue キーワードとは
continueステートメントは、現在実行中のループブロック(for, while, do-while, foreach)において、残りの処理を即座に中断し、強制的に次のイテレーション(繰り返し)の評価に移るよう制御します。
continueが呼び出されると、continue以降に記述されているループブロック内のコードは実行されません。
forループの場合: 「変化式」(例:i++)が実行され、次に「条件式」が評価されます。while/do-whileループの場合: すぐに「条件式」の評価に移ります。foreachループの場合: すぐにコレクションの「次の要素」の取り出しに移ります。
continue の使用例
continueは、if文と組み合わせて使用するのが一般的です。
例1: foreach で特定の要素をスキップする
商品価格のリスト(List<decimal>)があり、合計金額を計算するシナリオを考えます。ただし、リストには0円やマイナス(無効なデータ)が含まれている可能性があり、それらは合計に加算せずに無視(スキップ)したいとします。
using System;
using System.Collections.Generic;
public class ContinueForeachExample
{
public static void Main()
{
// 0円やマイナスを含む商品価格リスト
var itemPrices = new List<decimal> { 1500m, 800m, 0m, -500m, 2100m };
decimal totalAmount = 0m;
Console.WriteLine("有効な価格のみを合計します...");
// foreach ループで価格を処理
foreach (var price in itemPrices)
{
// 価格が0以下の場合は、この回の処理をスキップする
if (price <= 0m)
{
Console.WriteLine($"無効な価格データ ({price}円) をスキップしました。");
continue; // これ以降の処理 (totalAmount += price) を実行せず、次の要素へ
}
// 有効な価格のみが加算される
totalAmount += price;
Console.WriteLine($"加算: {price}円 (現在合計: {totalAmount}円)");
}
Console.WriteLine($"---");
Console.WriteLine($"最終合計金額: {totalAmount}円");
}
}
出力結果:
有効な価格のみを合計します...
加算: 1500円 (現在合計: 1500円)
加算: 800円 (現在合計: 2300円)
無効な価格データ (0円) をスキップしました。
無効な価格データ (-500円) をスキップしました。
加算: 2100円 (現在合計: 4400円)
---
最終合計金額: 4400円
例2: for ループで特定の条件をスキップする
1から20までの数値のうち、「偶数」のみを出力したい場合(=奇数の場合はスキップしたい場合)は、以下のように記述できます。
using System;
public class ContinueForExample
{
public static void Main()
.WriteLine("1から20までの偶数のみを表示します:");
for (int i = 1; i <= 20; i++)
{
// 数値が奇数かどうかを判定 (2で割った余りが1かどうか)
if (i % 2 == 1)
{
continue; // 奇数の場合、この下の Console.WriteLine をスキップして i++ に進む
}
// 偶数の場合のみ、この処理が実行される
Console.WriteLine(i);
}
}
}
出力結果:
1から20までの偶数のみを表示します:
2
4
6
8
10
12
14
16
18
20
continue と break の明確な違い
continueとよく似た制御ステートメントにbreakがありますが、動作は全く異なります。この違いを理解することは非常に重要です。
continue(スキップ): ループの現在の回(イテレーション)だけを中断し、次の繰り返し処理に進みます(ループは継続します)。break(中断): ループ全体を即座に終了し、ループ構文の次のステートメントに制御を移します(ループは終了します)。
使い分け:
continue: 「このデータは処理不要なので、次に行ってほしい」break: 「探していたデータが見つかったので、もう探す必要はない」
まとめ
continueキーワードは、ループ処理の途中で特定の条件に合致した場合に、その回の処理を安全にスキップするための構文です。
if文と組み合わせることで、エラーデータの無視や特定条件の除外など、ループのロジックをより柔軟かつ可読性高く記述できます。breakとの違いを明確に理解し、適切に使い分けることが重要です。
