C#
 Computer >> コンピューター >  >> プログラミング >> C#

C++とC#におけるforeachループの使い方を徹底解説

コレクションや配列の各要素を順番に処理したい場合、foreachループは非常に便利な構文です。従来のforループではインデックスの管理が必要でしたが、foreachを使えば要素そのものを直接取り出して処理できるため、コードがシンプルになり、バグも減らせます。

この記事では、C++とC#それぞれにおけるforeachの書き方と実行例をわかりやすく解説します。


C++におけるforeach(範囲ベースforループ)

C++には厳密には「foreach」という名前のキーワードは存在しませんが、C++11で導入された範囲ベースforループ(range-based for loop)が同等の機能を提供します。配列やコンテナ(std::vectorなど)の各要素を簡潔に走査できます。

サンプルコード

#include <iostream>
using namespace std;

int main() {
    int myArr[] = { 99, 15, 67 };

    // 範囲ベースforループ(foreach相当)
    for (int ele : myArr)
        cout << ele << endl;
}

実行結果

99
15
67

この例では、配列myArrの各要素が変数eleに順に代入され、1つずつ出力されます。インデックスを意識する必要がないため、要素数の計算ミスなどのトラブルを防げるのが大きなメリットです。

なお、要素を書き換えたい場合はint &ele : myArrのように参照を受け取ることで対応できます。また、不要なコピーを避けたい場合にも参照渡しが有効です。

C#におけるforeach

C#ではforeachステートメントが言語仕様として正式に用意されており、配列やListなどのコレクション内の項目を簡単に走査できます。IEnumerableインターフェースを実装しているオブジェクトであれば、foreachで反復処理が可能です。

サンプルコード

using System;

namespace ArrayApplication {
    class MyArray {
        static void Main(string[] args) {
            int[] n = new int[10]; /* 整数10個分の配列n */

            for (int i = 0; i < 10; i++) {
                n[i] = i + 100;
            }
            /* 各配列要素の値を出力 */
            foreach (int j in n) {
                int i = j - 100;
                Console.WriteLine("Element[{0}] = {1}", i, j);
            }
            Console.ReadKey();
        }
    }
}

実行結果

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

このプログラムでは、まず通常のforループで配列nに100〜109の値を格納し、その後foreachループで全要素を取り出して表示しています。foreach (int j in n)の部分で、配列の各要素が変数jに順番に代入される仕組みです。

foreachを使うメリットまとめ

  • 可読性の向上: インデックス管理が不要になり、コードの意図が明確になります。
  • バグの防止: 配列の範囲外アクセス(オフバイワンエラー)などを防ぎやすくなります。
  • 汎用性: 配列だけでなく、リストや辞書などさまざまなコレクションに対応できます。

一方で、要素のインデックスが必要な場合や、ループ中にコレクションの構造を変更したい場合は、従来のforループの方が適しています。用途に応じて両者を使い分けることが、質の高いコードを書くポイントです。

  1. C++で円と長方形の重なりを判定するアルゴリズム

    問題の概要円を (radius, xc, yc) という形式で表します。ここで (xc, yc) は円の中心座標です。同様に、軸に平行な長方形(軸平行境界ボックス)を (x1, y1, x2, y2) という形式で表し、(x1, y1) が左下隅の座標、(x2, y2) が右上隅の座標とします。このとき、円と長方形が互いに重なっているかどうかを判定する必要があります。たとえば、次のような入力が与えられた場合を考えてみましょう。この場合、出力は true(重なりあり)となります。解決のアプローチこの問題を解く鍵は、「長方形の中で円の中心に最も近い点」を見つけることです。その点と円の中心との距離が

  2. C++で解くドミノとトロミノを使ったタイル敷き詰め問題(2×Nボード)

    問題の概要本記事では、「ドミノ」と「トロミノ」という2種類の形状を使ったタイル敷き詰め(タイリング)問題をC++で解く方法を解説します。これらのピースは、以下のように回転させて使用することができます。タイリングでは、盤面上のすべてのマスを必ずタイルで覆わなければなりません。また、2つのタイリング方法は、盤上の4方向に隣接する2つのセルにおいて、片方のタイリングだけがその両方のマスを同じタイルで占有している場合に限り「異なる」とみなされます。入力と出力の例整数Nが与えられたとき、2×Nのボードを敷き詰める方法が何通りあるかを求めます。例えば、入力が3の場合、出力は5となります。敷き詰め方は以下の