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文を使うと記述が簡潔になるので便利です。
こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。
ただし、List型のオブジェクトでforeach文を使う場合は注意しなければならないことがあります。
foreach文を使ってRemoveメソッドで要素を削除する場合に、エラーが発生することがあります。
こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。
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の値にのみアクセスする方法など、詳しくはこちらのサイトで解説しています。
ぜひ参考にしてください。
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文と比べて簡潔に記述することができます。
簡潔に記述しコードを読みやすくすることでトラブルを減らすこともできますので、使いこなすことができるように、この記事を何度も参考にして下さいね!