basyura's blog

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

C# - インデックス付き Select

Enumerable.Select(TSource, TResult) メソッド (IEnumerable(TSource), Func(TSource, Int32, TResult)) (System.Linq)

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, int, TResult> selector
)

要素が 1 個でも 1000 個でも変わるのは 1 ms 程度だったという驚き。

var list = Enumerable.Range(0, 1).Select(v => v.ToString()).ToList();

var watch = Stopwatch.StartNew();
var i = 0;
foreach (var v in list)
{
    i ++;
}
watch.Stop();
Console.WriteLine(watch.Elapsed);

watch = Stopwatch.StartNew();
foreach (var v in list.Select((value, index) => new { value, index }))
{
    Console.WriteLine(v.value);
    Console.WriteLine(v.index);
}
watch.Stop();
Console.WriteLine(watch.Elapsed);

わざわざカウンターを別に設けなくても良かったのね。記述が冗長になる気はするけど・・・どっちがいいのかなぁ。思い切って for 使ってもいい気がしないでもない。

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

ループの先頭で変数に入れてしまえば添字の書き間違いなんてそうそう起こらないだろうし。 てなことを今更ながら考えてたりする今日このごろ。

blog 等では列数確保のために var を使うけど、仕事で書くときは型をきっちり書く派。この変数、メソッドの戻り値がどういう型なのか気になるし、調べるためにマウスカーソルを当てるのもだるいので最初から見えてたほうがいいじゃん派。var を使ったほうがきれいに見えるのだけど・・・考える上ではあまり便利とは思えないのであった。