2008年02月10日

LINQってやっぱりすごい

  
C#でLINQの動きを確かめるために、以下のようなコードを作ってみました。

static class Program {
static void Main(string[] args) {
var nums = Enumerable.Range(1, 10);
var q = from n in nums
where n % 3 == 0
select n * 2;
foreach (var n in q)
Console.WriteLine(n);
}

public static IEnumerable<TSource> Where<TSource>(
          this IEnumerable<TSource> source,
Func<TSource, bool> predicate) {
foreach (var x in source) {
if (predicate(x))
yield return x;
}
}

public static IEnumerable<TResult> Select<TSource, TResult>(
          this IEnumerable<TSource> source,
Func<TSource, TResult> selector) {
foreach (var x in source) {
yield return selector(x);
}
}
}


独自の拡張メソッドを書くことで、クエリ式で呼び出されるメソッドを標準のものから、独自のものへ置き換えることが可能です。

上記コードからら分かるように、(そして、多くの方が指摘しているように)、LINQ to Objectの中身は列挙処理となってます。
たぶん、標準のWhere や Selectメソッドも同様の実装になっていると思われます。

で、実際にステップ実行してみたら、僕の予想とは違った動きをしました。
Whereのループが終わってから、Selectのループが動くと思ったのですが、そうはなりませんでした。
これには、最初とても驚きました。

なるほど、そういうことだったのか。すごいな〜。
僕は、素直にLINQってすごいなーと感心してしまいます...


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51396767