EduLINQは、いかに LINQ to Objects オペレータが動くかを説明するための試みである。 MoreLINQ は、標準のオペレータを拡張した、LINQ to Objects オペレータのセットである。LINQBridge は、 LINQ to Objectsの.NET Framework 2.0へのポートである。
Jonathan Skeet氏は、2003年以来、 Microsoft C# MVPで、“C# in Depth”という本の著者であるが、最近 EduLINQプロジェクトという、LINQメソッドがいかに機能するかを説明する試みで、 LINQ to Objectsの再実装を終えた。 Apache License 2.0のもとにリリースされたこのプロジェクトには、ソースコードとユニットテストが付いていて、.NET Framework 3.5をターゲットにしている。氏による、学んだ教訓は以下である。
- LINQ to Objectsは、拡張メソッド、デリゲート、IEnumerable<T> をベースにしている
- オペレータは、適切であれば遅延実行を使い、可能であればデータを流す
- オペレータは、元のソースを変えないで、適切なデータを返す新しいシーケンスを返す
- クエリ式は、パターンのコンパイラ翻訳に基づいている。もうパターンを実装する必要はなく、関連するクエリ式だけである
- イテレータ ブロックは、遅延実行を実装するのに非常に都合がいい
- しかし、念入りの引数バリデーションが苦痛になる
氏は、MoreLINQと呼ばれるプロジェクトを作った。これは標準の LINQ to Objectオペレータを補完する 21ヶのオペレータ を持つライブラリである。
- Batch – 「Batchは、ソース シーケンスをバケットの大きさにまとめる」
- Consume –「完全に特定シーケンスを消費する。このメソッドは直ちに実行され、実行中のデータは保存しない」
- EquiZip –「タプルの写像を返す。各タプルは、各引数のシーケンスからのN番目の要素を持っている」
- MaxBy –「特定の写像を基に、特定シーケンスの最大要素を返す」
- Scan – 「要素のシーケンスに対してスキャンを実行する(包括的なプレフィックスの合計)」
- Zip –「タプルの写像を返す。各タプルは、各引数のシーケンスからのN番目の要素を持っている」
LINQBridge は、LINQ to Objectsを.NET Framework 2.0へポートしたもので、.NET Frameworkの以前のバージョンを使って、困っていた人たちにLINQの柔軟性とパワーを提供するものである。