初心者向け!C#で学ぶ反復処理の10の基本テクニック – JPSM

初心者向け!C#で学ぶ反復処理の10の基本テクニック

初心者がC#の反復処理を学ぶためのイラスト付きガイドC#

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

また、理解しにくい説明や難しい問題に躓いても、JPSMがプログラミングの解説に特化してオリジナルにチューニングした画面右下のAIアシスタントに質問していだければ、特殊な問題でも指示に従い解決できるように作ってあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

C#を学び始めたばかりの方にとって、この記事は重要な一歩となるでしょう。

ここでは、C#の基本的な概念である「反復処理」に焦点を当て、その理解と応用を深めていきます。

反復処理は、コードの中で同じ操作を繰り返し行うための手段であり、プログラミングにおける非常に重要な要素の一つです。

この記事を読むことで、C#における反復処理の基本を学び、実際のコーディングに活かすことができるようになります。

●C#の反復処理とは

C#における反復処理は、指定された条件が満たされる間、コードブロック内の命令を繰り返し実行するプログラミングの基本技術です。

これにより、手作業で複数の命令を何度も書く代わりに、コードを効率的にし、プログラムの実行時間を短縮できます。

反復処理は、特定の条件が満たされるまで繰り返す「while」ループ、決まった回数で繰り返す「for」ループ、そしてコレクションの各要素に対して操作を行う「foreach」ループなど、様々な形で利用されます。

○反復処理の基本的な概念

反復処理を理解する上での最も基本的な概念は、ループと条件です。ループは、特定の条件が真の間、コードブロックを繰り返し実行する構造を持ちます。

この条件は、ループの開始前や繰り返しの各ステップで評価され、条件が偽になるとループは終了します。

反復処理の使用例としては、配列やリストのすべての要素を操作する、特定の条件が満たされるまでユーザー入力を求め続ける、計算結果が特定の範囲内に収まるまで計算を繰り返すなどがあります。

これらのプロセスは、手作業で行うよりもはるかに効率的で、エラーの可能性も減少させます。

●基本の反復処理

C#における最も基本的な反復処理の一つがforループです。

forループは、特定の回数だけコードを繰り返すのに適しており、ループの開始前に初期化される変数、ループの継続条件、そして各反復の終わりに実行される式から構成されます。

この構造を使えば、例えば、0から9までの数字を順番に出力するなどの操作を簡単に行うことができます。

○サンプルコード1:数値のカウントアップ

forループを用いて、0から9までの数値をカウントアップするシンプルな例を見てみましょう。

このコードでは、forループを使って、初期値0から始め、10未満の間(つまり、0から9まで)カウントアップしています。

ループの各ステップで、カウンタ変数「i」の値を1ずつ増やしています。

for (int i = 0; i < 10; i++) {
    Console.WriteLine(i);
}

実行すると、このコードは0から9までの数値を一行ずつ出力します。

これにより、同じコードを何度も書くことなく、繰り返しの処理を効率的に行うことができます。

○サンプルコード2:配列の要素を順に処理

次に、配列の要素を順に処理するforループの例を見てみましょう。

ここでは、文字列の配列を用意し、forループを使ってその各要素を順に出力するコードを紹介します。

この例では、配列の長さ(要素数)を取得し、その範囲内でループを実行しています。

string[] fruits = { "Apple", "Banana", "Cherry" };
for (int i = 0; i < fruits.Length; i++) {
    Console.WriteLine(fruits[i]);
}

このコードを実行すると、「Apple」、「Banana」、「Cherry」という配列の各要素が順番に出力されます。

この方法を用いることで、配列やリストのようなコレクションの要素に対する操作を効率的に行うことができるのです。

●whileループの使い方

whileループは、指定された条件が真(true)である限り、コードブロックを繰り返し実行するC#の重要な機能です。

このループは、特定の条件が満たされるまで処理を続ける必要がある場合に特に有用です。

たとえば、ユーザーが特定の入力を行うまでプログラムを待機させる場合などに使用します。

○サンプルコード3:条件によるループの継続

whileループの典型的な使用例として、特定の条件が満たされるまで数値をカウントアップするシンプルな例を考えてみましょう。

この例では、変数「i」が5未満である間、ループを続け、iを1ずつ増加させています。

int i = 0;
while (i < 5) {
    Console.WriteLine(i);
    i++;
}

このコードを実行すると、0から4までの数値が順に出力されます。

whileループは、ループの開始時点で条件をチェックし、条件が偽(false)になるまで繰り返し処理を行います。

○サンプルコード4:ユーザー入力の処理

もう一つの一般的なwhileループの使用例は、ユーザーからの特定の入力を待つ場合です。

下記の例では、ユーザーが「exit」と入力するまでプログラムが繰り返し実行され、ユーザーの入力を受け取り続けます。

string userInput;
do {
    Console.Write("Enter 'exit' to stop: ");
    userInput = Console.ReadLine();
} while (userInput != "exit");

このコードは、ユーザーが「exit」と入力するまで「Enter ‘exit’ to stop: 」というプロンプトを表示し続け、ユーザーの入力を受け付けます。

ユーザーが「exit」と入力すると、whileループは条件が偽になり、ループから抜け出します。

●do-whileループの応用

do-whileループは、whileループと似ていますが、少し異なる特徴があります。

このループは、条件を評価する前に、ループ内のコードブロックを少なくとも一度実行します。

つまり、条件が初めから偽であっても、コードブロックは一度は実行されるということです。

この特性は、条件がループの終了後まで決定されない場合や、ループを最低一度は実行する必要がある場面で役立ちます。

○サンプルコード5:最低一度の実行保証

do-whileループを使って、ユーザーが特定の入力をするまでメッセージを表示し続ける例を考えてみましょう。

このコードでは、ユーザーが「exit」と入力するまで繰り返しメッセージを表示し、ユーザーの入力を受け付けます。

do-whileループは、ユーザーが少なくとも一度はメッセージを見ることを保証します。

string userInput;
do {
    Console.Write("Enter 'exit' to stop: ");
    userInput = Console.ReadLine();
} while (userInput != "exit");

このコードを実行すると、少なくとも一度は「Enter ‘exit’ to stop: 」というプロンプトが表示され、ユーザーが「exit」と入力するまで繰り返されます。

これにより、ユーザーに対する指示を確実に伝えることができ、意図した操作をさせることが可能になります。

●foreachループの活用

C#において、配列やコレクションを扱う際に非常に便利なのがforeachループです。

このループを使用すると、配列やリストなどのコレクションの各要素に対して、繰り返し処理を簡単に実行できます。

foreachループは、コレクションの各要素を順に取り出し、その要素に対して指定された操作を行うため、コレクションのサイズが事前に不明な場合や、すべての要素に対して処理を適用したい場合に特に有用です。

○サンプルコード6:コレクションの簡易処理

例として、文字列の配列に含まれる各要素をforeachループを使用して表示するシンプルなコードを見てみましょう。

この例では、配列内の各文字列に対して、順番に処理を適用しています。

string[] fruits = { "Apple", "Banana", "Cherry" };
foreach (string fruit in fruits) {
    Console.WriteLine(fruit);
}

このコードを実行すると、「Apple」、「Banana」、「Cherry」という配列の各要素が順に出力されます。

foreachループは、コレクション内の各要素を自動的に取り出し、指定されたブロック内のコードに適用するため、コードの可読性が高く、使いやすいのが特徴です。

○サンプルコード7:リストの各要素へのアクセス

次に、List型のコレクションを用いたforeachループの例を見てみましょう。

この例では、List内の各整数に対して処理を適用し、その値を出力しています。

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (int number in numbers) {
    Console.WriteLine(number);
}

このコードを実行すると、1から5までの数値が順に出力されます。

Listや他のコレクション型を扱う際にforeachループを使うと、コレクションの内部構造に関わらず、その要素に対して簡単にアクセスできるため、柔軟かつ効率的なコーディングが可能になります。

●ループ内の制御構造

反復処理を行う際には、ループの実行を制御するための特定の構造を使用することができます。

C#では、ループの途中で処理を中断したり、次の反復に移行したりするために、「break」と「continue」という2つの重要なキーワードを提供しています。

これらのキーワードを適切に使用することで、ループの動作をより柔軟に制御することが可能になります。

○サンプルコード8:breakとcontinueの使用例

まず、「break」キーワードを使用した例を見てみましょう。

このキーワードは、ループの実行を完全に停止し、ループの外に制御を移します。

下記の例では、特定の条件が満たされた場合にforループを途中で終了させます。

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break; // iが5に達したらループを終了
    }
    Console.WriteLine(i);
}

このコードを実行すると、0から4までの数値が出力された後、iが5に達した時点でループが終了します。

これにより、特定の条件下でループを即座に終了させることができます。

次に、「continue」キーワードを使用した例を見てみましょう。

このキーワードは、ループの現在の反復をスキップし、次の反復に直接進みます。

下記の例では、特定の条件を満たす場合にその反復をスキップします。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) { // iが偶数の場合、以下の処理をスキップ
        continue;
    }
    Console.WriteLine(i);
}

このコードを実行すると、1から9までの奇数が出力されます。

iが偶数の場合、Console.WriteLine(i)の行は実行されず、ループは次の反復に直接進みます。

●反復処理のネスト

プログラミングにおいて、反復処理のネストは一つのループの中に別のループを含めることを指します。

これは、多次元配列を扱ったり、複雑なデータ構造に対して操作を行ったりする場合に特に有用です。

ネストされたループを適切に使用することで、多層的なデータ処理が可能になり、プログラムの機能を拡張できます。

○サンプルコード9:多次元配列の処理

例として、2次元配列内の要素を処理するネストされたforループの例を見てみましょう。

下記の例では、各行と列の要素にアクセスして値を出力しています。

int[,] matrix = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

for (int i = 0; i < matrix.GetLength(0); i++) {
    for (int j = 0; j < matrix.GetLength(1); j++) {
        Console.Write(matrix[i, j] + " ");
    }
    Console.WriteLine();
}

このコードを実行すると、2次元配列の各要素が行ごとに出力されます。

外側のループが行を、内側のループが列を処理しています。

○サンプルコード10:組み合わせの生成

もう一つの応用例として、異なる2つの配列の要素からすべての可能な組み合わせを生成する例を考えてみましょう。

この例では、ネストされたforeachループを使用して各組み合わせを出力します。

char[] letters = { 'A', 'B', 'C' };
int[] numbers = { 1, 2, 3 };

foreach (char letter in letters) {
    foreach (int number in numbers) {
        Console.WriteLine($"{letter}{number}");
    }
}

このコードを実行すると、「A1」、「A2」、「A3」、「B1」、「B2」、「B3」、「C1」、「C2」、「C3」というすべての組み合わせが出力されます。

ネストされたループを利用することで、複数のデータセットから複雑な組み合わせを効率的に生成することが可能になります。

●反復処理の注意点と対処法

C#での反復処理を行う際にはいくつかの重要な注意点があります。

これらを理解し、適切に対処することで、効率的かつ効果的なプログラミングが可能になります。

まず、無限ループを避けることが重要です。

無限ループは、プログラムが終了条件に到達せずに永遠に繰り返しを続ける状態を指します。

これを防ぐためには、ループの終了条件を明確に設定し、その条件がいずれは必ず満たされるようにする必要があります。

○無限ループの回避

例えば、whileループを使用する場合、ループの終了条件として変数を設定し、ループ内でその変数が変更されるようにします。

下記のコードは、ユーザーが特定の値を入力するまでループを繰り返す簡単な例です。

int userInput;
do {
    Console.WriteLine("5を入力してループを終了させてください。");
    userInput = Convert.ToInt32(Console.ReadLine());
} while (userInput != 5);

この例では、ユーザーが「5」を入力するまで、プログラムは繰り返し入力を求めます。

次に、パフォーマンスへの影響を考慮することも大切です。

特に大規模なデータセットや複雑なネストされたループを使用する場合、パフォーマンスに悪影響を与える可能性があります。

○パフォーマンスへの影響

パフォーマンスに影響を与える要因としては、ループの回数が多すぎること、不必要な計算を繰り返していることなどが挙げられます。

例えば、下記のコードは二重のforループを使っていますが、内側のループが不必要に多くの回数実行されています。

for (int i = 0; i < 100; i++) {
    for (int j = 0; j < 1000; j++) {
        // 何かの処理
    }
}

このような場合、ループの構造を見直すことや、必要のない処理を省くことでパフォーマンスを向上させることができます。

●カスタマイズ方法

C#での反復処理を行う際には、パフォーマンスの最適化やコードの可読性の向上を目指すカスタマイズが重要です。

ここでは、ループの効率的な使い方とコードの可読性を向上させる方法について詳しく解説します。

ループの効率的な使い方では、必要最小限の処理をループ内に含め、不要な処理はループの外に配置することが重要です。

また、ループの条件式で高コストな計算を避けることも、パフォーマンス向上に寄与します。

○ループの効率的な使い方

例えば、下記のコードでは、ループの外で計算されるべき値がループ内で毎回計算されています。

int arrayLength = array.Length;
for (int i = 0; i < arrayLength; i++) {
    // ループ内での処理
}

このコードでは、array.Lengthはループの外で一度だけ計算され、ループ内ではその値が使用されています。

これにより、ループの各イテレーションでの計算コストが削減されます。

次に、コードの可読性を向上させるためには、ループの目的が明確で、簡潔なコードを心がけることが重要です。

ループ内の処理を小さな関数に分割することで、コードの理解が容易になります。

○コードの可読性の向上

例えば、下記のコードでは、ループ内の処理が別の関数に分離されています。

foreach (var item in collection) {
    ProcessItem(item);
}

void ProcessItem(ItemType item) {
    // itemの処理
}

この例では、ProcessItem関数はループ内の各要素に対する処理を担当します。

これにより、ループ自体の構造がシンプルに保たれ、コード全体の可読性が向上します。

まとめ

この記事を通じて、C#における反復処理の基本から応用までを幅広く解説しました。

反復処理はプログラミングにおいて非常に一般的であり、whileループ、do-whileループ、foreachループなど、さまざまな形で使用されます。

各ループの特性を理解し、適切なシナリオで利用することが重要です。

C#での反復処理をマスターすることは、プログラミングスキルを高める上で非常に有効です。

本記事で解説した知識とサンプルコードを活用し、より効率的で読みやすいコードを書くことを目指しましょう。

反復処理を通じて、より複雑で洗練されたプログラムの構築が可能になります。