C#

【C#】foreachのループでの豆知識

foreachで何回目のループかを判定する方法

カウンター変数を宣言してインクリメント

ぱっと思いつきそうなやり方です。

int i = 1;
var collection = Enumerable.Range(100, 10);
foreach (var item in collection)
{
    Console.WriteLine($"{i}回目のループです。");
    i++;
}
//1回目のループです。
//2回目のループです。
//3回目のループです。
//4回目のループです。
//5回目のループです。
//6回目のループです。
//7回目のループです。
//8回目のループです。
//9回目のループです。
//10回目のループです。

LinqのSelectでインデックスと値を射影

上記と結果は同じですが、ちょっとカッコイイやり方です。

var collection = Enumerable.Range(100, 10);
foreach (var item in collection.Select((x, i) => new { Index = i + 1, Value = x }))
{
    Console.WriteLine($"{item.Index}回目のループです。");
}
//1回目のループです。
//2回目のループです。
//3回目のループです。
//4回目のループです。
//5回目のループです。
//6回目のループです。
//7回目のループです。
//8回目のループです。
//9回目のループです。
//10回目のループです。

foreachでループの末尾か判定

インデックスがコレクションの要素数と等しいかで判定します。

var collection = Enumerable.Range(100, 10);
foreach (var item in collection.Select((x, i) => new { Index = i + 1, Value = x }))
{
    if (item.Index == collection.Count())
    {
        Console.WriteLine($"ループの末尾です。値:{item.Value}");
    }
    //ループの末尾です。値:109
}

forの代わりにforeachを使う

forの代わりにforeachを使うことができます。

int loopNum = 10;
Console.WriteLine("forの場合");		
for(int i = 0; i < loopNum; i++){
	Console.WriteLine(i);
}

Console.WriteLine("foreachの場合");
foreach(var item in Enumerable.Range(0, loopNum)){
	Console.WriteLine(item);
}

// forの場合
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// foreachの場合
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9

上記のコードはどちらも同じ結果になります。Enumerable.Range() でループ回数分のコレクションを生成して、foreachでループすることによりfor文と同じ動作を実現します。

注意点としては、Enumerable.Range()の第一引数は範囲の開始する数値ですが、第二引数は範囲を終了する数値ではなく開始値(start)から何個生成するか(count)ということです。
Enumerable.Range(0, 10) ⇒ 0~9 になります。

https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.range?view=net-6.0

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です