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