atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

LinqのWhereでの列挙中に、列挙を中断できる

IEnumerableを返すためにyield returnを使うコードを、最近になって初めて実践的に使った。するとあることに気付いた。次のコード、yieldに慣れていないとどう動くか予想しづらいのではないか。

int count = 0;
var array = new object[100];
foreach (var obj in array.Where((o) =>
{
    count++;
    return true;
}))
{
    Console.WriteLine(count);
    if (count >= 10)
    {
        break;
    }
}


結果は、1から10までがコンソールに出力される。11以上は出力されない。つまり、IEnumerableの拡張メソッドWhereは、その列挙中に列挙を中断できるということだ。これを利用すると、ループの回数を減らして、パフォーマンスを改善できる場面があるかもしれない*1

私はLinqを真面目に勉強したことがない*2ので、同様のことをもっとスマートにやる方法があるかもしれない。スマートなやり方をご存じの方、教えてもらえませんか?

*1:あまり思いつかないが

*2:@ITの入門記事を流し読みした程度