basyura's blog

あしたになったらほんきだす。

C# - ループカウンタ

LINQ でループカウンタがあるメソッドがあるのを知らなかった。使いどころがよく分からんけど。

var list = new List<string> { "a", "b", "c", "d", "e" };
list.Where((v, i) => {
    Console.WriteLine(v + " " + i);
    return true;
}).ToList();

for を使わずに foreach を使えれば添字を間違えなくて済むしすっきり書けるとかなんとかあるけど、やっぱり必要な時がある。一つ目だけ任意の処理をしたいとか、ある条件を満たした以降は処理を切り替えるとか。すっきり書きたいのだけど書けない。

C#でforeachを使用してループを行うと、シンプルな表記で集合内のデータを処理する事ができるので便利ですが、何番目の値を処理しているかのループカウンタが無いのが不便です。

このような場合は、以下のようにSelect()メソッドを使用すると処理中データのindexを取得できます。

string nameArray = new string[] { "alice", "bob", "charlie", "dave" };

foreach ( var nameObj in nameArray.Select((value, index) => new { value, index }))
{
    Console.WriteLine( "{0}人目: 名前{0}", nameObj.index, nameObj.value );
}
foreach文でループカウンタを取得する方法

書けるのだけど、ごちゃっと感と無駄なインスタンス生成は否めない。

foreach (var v in list) : i
{

}

とか

foreach (var v, var i in list)
{

}

ぐらいで書けると嬉しいのだけどなぁ。

for (int i = 0; i < list.Count; i++)
{
    var hoge = list[i];
}

ぐらいが妥当だろうなぁ。for を使うけど、先頭で変数に入れてしまって以降はその変数を使うことで紛らわしさを減らす感じ。

そもそも for じゃなくて foreach を使えの根拠はなんだっけ?