foreachを使うと配列やコレクションといったデータの集まりからすべての要素を一つずつ取り出しながら処理を行うことができます。
foreachの使い方
foreachの構文はこんな感じです。
foreach ( 要素の型 要素を受け取る変数名 in 配列やコレクション) { ...; }
要素:配列やコレクションの中にある1つ1つのデータのこと。
要素の型:配列やコレクションの要素の型を指定します。たいていはvarでいいと思います。
要素を受け取る変数名:各要素が順番にこの変数に入ります、{ } ブロック内のみで有効です。繰り返し変数というらしい。
配列やコレクション:要素を取り出したい配列・コレクション(ListやDictionaryなど)を指定します。
using System;
using System.Collections.Generic; //Listを使うのに必要
class Program
{
public static void Main()
{
// 配列をforeachで順番に取り出す
int[] ary = new int[] { 10, 20, 30 };
// foreachを使って各要素を1つずつ取り出す
foreach (int i in ary) {
Console.WriteLine(i);
}
// string型のリストをforeachで順番に取り出す
List<string> list = new List<string> { "a", "b", "c" };
// foreachを使って各要素を1つずつ取り出す
foreach (string str in list) {
Console.WriteLine(str);
}
}
}
また、foreachの { } ブロック内の処理が1行だけの場合、{ } を省略することができます。
using System;
class Program
{
public static void Main()
{
// 配列をforeachで順番に取り出す
int[] ary = new int[] { 10, 20, 30 };
// foreachを使って各要素を1つずつ取り出す
foreach (int i in ary) Console.WriteLine(i);
}
}
foreach内での値の設定について
foreach内で使われる繰り返し変数に値を代入しようとするとエラーになります。
配列やコレクションの全て要素を初期化したいというときには、forを使いましょう。
class Program {
public static void Main() {
// int型の要素を5個もった配列を定義
int[] ary = new int[5];
// 各要素に初期値として0を代入
for (int i = 0; i < ary.Length; i++) {
ary[i] = 0;
}
}
}
途中でforeachを抜け出す(break)
break キーワードを使うとforeachの途中で処理を中断してforeachブロック{ } を抜けることができます。
大体の場合、ifで条件を満たした場合にbreakするという使い方だと思います。
using System;
class Program
{
public static void Main()
{
// 配列をforeachで順番に取り出す
int[] ary = new int[] { 10, 20, 30, 40, 50 };
// foreachを使って各要素を1つずつ取り出す
foreach (int i in ary) {
Console.WriteLine(i);
// iが30だったらforeachを抜ける
if (i == 30) break;
}
}
}
出力結果はこんな感じです。3つ目の要素(30)を処理してforeachを抜けています。
10
20
30
foreachの途中で次の要素にスキップする(continue)
continue キーワードを使うとforeachの途中で次の要素へスキップすることができます。
こちらもifで条件を指定して処理をスキップするという使い方が多いと思います。
using System;
class Program
{
public static void Main()
{
// 配列をforeachで順番に取り出す
int[] ary = new int[] { 1, 2, 3, 4, 5 };
// foreachを使って各要素を1つずつ取り出す
foreach (int i in ary) {
// 奇数の場合に処理をスキップ
if (i % 2 == 1) continue;
Console.WriteLine(i);
}
}
}
2
4
forとforeachの違い
for文の場合は、カウンター変数を使いインデックスを使って配列やコレクションにアクセスしたいときに使います。
using System;
class Program
{
public static void Main()
{
int[] ary = new int[] { 10, 20, 30, 40 };
for (int i = 0; i < ary.Length; i++) {
// インデックスを使って各要素にアクセス
Console.WriteLine(ary[i]);
}
}
}
foreach文ではインデックスを使わずにすべての要素を順番に取り出すことができます。
なので、Dictionaryなどインデックスではアクセスできないコレクションも取り出すことが出来ます。
using System;
using System.Collections.Generic;
class Program
{
public static void Main()
{
int[] ary = new int[] { 10, 20, 30, 40 };
foreach (int i in ary) {
// foreachを使って各要素を1つずつ取り出す
Console.WriteLine(i);
}
var dic = new Dictionary<string, int> {
{ "key1", 1 },
{ "key2", 2 },
{ "key3", 3 },
};
foreach (var keyValue in dic) {
//Dictionaryの要素はKeyValuePair型
Console.WriteLine($"key={keyValue.Key}, value={keyValue.Value}");
}
}
}
foreachが使えるのはIEnumerableなもの
見出し通りですがforeachのinに指定できるのはIEnumerableというインターフェースを実装している必要があります。自分で作ったクラスをforeachで使いたいというときにこのインターフェースを使う必要があるので、そのときに思い出してください。
イテレーター(iterator)という機能を使い、簡単にIEnumerableインターフェースを実装する方法があります。詳細はこちらの記事をみてください。
とりあえず、foreachが使えるのは配列とコレクション(List、Dictionaryなど)と覚えておけば大丈夫です。
C# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント
[…] […]