【C#入門】foreachの使い方(break、continueでの制御も解説)

foreachって使っていますか?

C#ではforeachを使って繰り返しループを簡潔に書くことができます。配列、List、Dictionaryなどのオブジェクトの要素にアクセスする場合に使うと便利です。

この記事では、foreachについて

  • foreachとは
  • foreachの使い方
  • Listでの使い方
  • Dictionaryでの使い方
  • Indexを取得する方法
  • breakで抜ける方法
  • continueでスキップする方法
  • LINQで置き換える方法

など基本的な内容から応用的な内容についても解説していきます。今回はforeachについて、使い方をわかりやすく解説します!

foreachとは?

foreach文とはfor文のように繰り返しループ処理を行う構文です。

配列やList、Dictionaryなどのコレクションの要素にアクセスする場合に使うことができて、for文と比べて簡潔に記述することができます。簡潔に記述しコードを読みやすくすることで、トラブルを減らすことができるというメリットがあります。

foreachの使い方

foreach文は以下のように記述して使います。

foreach(型名 オブジェクト名 in コレクション) {
    処理文
}

これに対してfor文は以下のように記述します。

for(int i = 0; i < コレクションの要素数; i++) {
    処理文
}

foreach文ではfor文のように、インデックス番号を指定するint型変数iを定義したり、それをループごとにインクリメント(i++)する必要はありません。

また、コレクションの要素数を取得する必要もありません。ですので、簡潔に記述することができて便利です。

そんなforeach文について、まずは配列での使い方をみていきましょう。

1次元配列での使い方

それでは1次元配列での使い方についてサンプルコードで確認しましょう。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[] src = new char[5]{'a', 'b', 'c', 'd', 'e'};
      
      foreach(char chr in src) {
        Console.WriteLine("{0}", chr);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

a
b
c
d
e

多次元配列での使い方

多次元配列の場合、どのように要素にアクセスするかサンプルコードで確認しましょう。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[,] src = new char[2, 3]{{'a', 'b', 'c'}, {'d', 'e', 'f'}};
      
      foreach(char chr in src) {
        Console.WriteLine("{0}", chr);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

a
b
c
d
e
f

このサンプルコードのように、1行目の要素から順にアクセスしていることがわかります。

Listでの使い方

Listでの使い方についてサンプルコードでみていきましょう。配列での使い方と変わりません。

using System;
using System.Collections.Generic;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[] src = new char[5]{'a', 'b', 'c', 'd', 'e'};
      var list = new List<char>();
      list.AddRange(src);
      
      foreach(char chr in list) {
        Console.WriteLine("{0}", chr);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

a
b
c
d
e

ちなみに、List型のオブジェクトの要素にはクラスを指定することもできます。要素のクラスオブジェクトにアクセスする場合にもforeach文を使うと記述が簡潔になるので便利です。

こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【C#入門】配列、Listをソートする方法(降順、カスタマイズも解説)
更新日 : 2019年4月25日

ただし、List型のオブジェクトでforeach文を使う場合は注意しなければならないことがあります。
foreach文を使ってRemoveメソッドで要素を削除する場合に、エラーが発生することがあります。

こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【C#入門】Add、RemoveでListの要素を追加、削除する方法
更新日 : 2019年5月22日

Dictionaryでの使い方

Dictionaryの要素はKeyとValueのセットになっています。

foreach文を使ってKeyの値にのみアクセスしたり、Valueの値にのみアクセスすることができます。もちろん、KeyとValue両方にアクセスすることもできます。

ここではKeyとValueの両方にアクセスする方法についてサンプルコードで確認しましょう。

using System;
using System.Collections.Generic;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      var myTable = new Dictionary<string, string>();
      myTable.Add("Hokkaido", "Sapporo");
      myTable.Add("Iwate", "Morioka");
      myTable.Add("Miyagi", "Sendai");
      
      foreach(KeyValuePair<string, string> item in myTable) {
        Console.WriteLine("[{0}:{1}]", item.Key, item.Value);  
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

[Hokkaido:Sapporo]
[Iwate:Morioka]
[Miyagi:Sendai]

Keyの値にのみアクセスする方法、Valueの値にのみアクセスする方法など、詳しくはこちらのサイトで解説しています。

ぜひ参考にしてください。

【C#入門】DictionaryのKey、Valueの使い方(要素の追加、取得も解説)
更新日 : 2019年4月22日

Indexを取得する方法

foreach文ではインデックス番号を使わずに簡潔に記述できることがメリットでした。

しかし、インデックス番号を使いたい場合もあります。そんな場合はLINQのSelectメソッドを使うと、foreach文のままでインデックス番号を取得することができます。
Selectメソッドを使って、要素とインデックス番号を持つ匿名型のオブジェクトをループするごとに作成します。

使い方をサンプルコードで確認しましょう。

using System;
using System.Linq;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[] src = new char[5]{'a', 'b', 'c', 'd', 'e'};
      
      foreach(var item in src.Select((value, index) => new{value, index})) {
        Console.WriteLine("src[{0}]:{1}", item.index, item.value);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

src[0]:a
src[1]:b
src[2]:c
src[3]:d
src[4]:e

breakで抜ける方法

break文はループを中断して、途中で抜けるときに使用します。
サンプルコードで確認しましょう。
サンプルコードでは、要素が'c'の場合にループを抜けるようにしています。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[] src = new char[5]{'a', 'b', 'c', 'd', 'e'};
      char chr = 'c';
      
      foreach(char item in src) {
        if(item == chr) {
          break;
        }
        
        Console.WriteLine("{0}", item);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

a
b

このサンプルコードのように、break文を処理するとその後の処理を行わずにforeach文のループから抜けます。

continueでスキップする方法

continue文はループ処理の途中で、残りの処理をスキップして次のループ処理に移る場合に使います。
サンプルコードで確認しましょう。
サンプルコードでは、要素が'c'の場合に残りの処理をスキップするようにしています。

using System;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[] src = new char[5]{'a', 'b', 'c', 'd', 'e'};
      char chr = 'c';
      
      foreach(char item in src) {
        if(item == chr) {
          continue;
        }
        
        Console.WriteLine("{0}", item);
      }
      
      Console.ReadKey();
    }
  }
}

実行結果:

a
b
d
e

このサンプルコードのように、continue文を処理するとその後の処理を行わずにforeach文の次のループに移動します。

LINQで置き換える方法

コレクションの要素にアクセスする場合、foreach文を使うとfor文を使うより簡潔に記述できるとお伝えしてきました。

実はそれよりもさらに簡潔に記述できる方法があります。

それは、LINQのWhereメソッドを使う方法です。
先ほどお伝えしたサンプルコードのbreak文やcontinue文を使う場合も置き換えることが可能です。

全ての要素にアクセスする場合

Whereメソッドですべての要素にアクセスする方法についてサンプルコードで確認しましょう。

全ての要素にアクセスするために、Whereメソッドでインデックス番号が0以上の要素にアクセスするようにしています。

using System;
using System.Linq;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[] src = new char[5]{'a', 'b', 'c', 'd', 'e'};
      
      var list = src.Where((v, i) => i >= 0);
      
      Console.WriteLine("{0}", string.Join(", ", list));
      
      Console.ReadKey();
    }
  }
}

実行結果:

a, b, c, d, e

break文を置き換える場合

先ほどのbreak文を使ったサンプルコードのように、要素が’c’の場合以降の処理を行わないようにしてみましょう。

Whereメソッドで要素の値が’c’より小さい場合に要素にアクセスするようにしています。

using System;
using System.Linq;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[] src = new char[5]{'a', 'b', 'c', 'd', 'e'};
      char chr = 'c';
      
      var list = src.Where((v, i) => v < chr);
      
      Console.WriteLine("{0}", string.Join(", ", list));
      
      Console.ReadKey();
    }
  }
}

実行結果:

a, b

continue文を置き換える場合

先ほどのcontinue文を使ったサンプルコードのように、要素が’c’の場合だけ処理を行わないようにしてみましょう。

Whereメソッドで要素の値が’c’の場合以外に要素にアクセスするようにしています。

using System;
using System.Linq;

namespace Sample
{
  class Sample
  {
    static void Main()
    {
      char[] src = new char[5]{'a', 'b', 'c', 'd', 'e'};
      char chr = 'c';
      
      var list = src.Where((v, i) => v != chr);
      
      Console.WriteLine("{0}", string.Join(", ", list));
      
      Console.ReadKey();
    }
  }
}

実行結果:

a, b, d, e

まとめ

ここでは、foreachについて説明しました。

foreachを使うと配列やList、Dictionaryなどのコレクションの要素にアクセスする場合に、for文と比べて簡潔に記述することができます。

簡潔に記述しコードを読みやすくすることでトラブルを減らすこともできますので、使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]