PseudoLinq 〜 .NET Framework 2.0 上で LINQ を使おう

・・・えっと、かなり凹んでます。みなさん、このエントリは読んでも無駄です。下記のmonoプロジェクトのソース使えばOKです。
http://anonsvn.mono-project.com/viewcvs/trunk/mcs/class/System.Core/
たぶん、作ったものはそのうち消します・・・。
穴があったら入りたい。トホホ。



僕はLINQが好きだ。LINQ構文というよりも、System.Linq.Enumerable が好きだ。最近は極力 for 文を使わないで LINQ で書くようにしている。

ところが、もう大分前のことだけれど、このブログのコメント欄にこう書かれてしまった。

それと .NET Framework 2.0では動作できないのでしょうか LINQなどを使っておられる
からだと思うのですが・・

3次元データのサムネイル表示ツールを作ったよ - カタチづくり

ドキッとした。僕は完全にユーザーの視点を見失っていたことに気づいたからだ。

ウェブアプリと違って、デスクトップアプリの場合は各ユーザーが .NET Framework 3.5 をインストールする必要が生じてしまう。.NET Framework 2.0 ならば既にインストール済みという人も増えてきたと思うけれど、3.5 はまだまだ少ないと思う。ユーザーから見れば、こういったランタイムライブラリをいちいちインストールしなくてはならないというのは面倒なものだ。しかも、.NET Framework 3.5 はミョーにインストールに時間がかかる。このインストールを強いるだけでユーザーを失ってしまいかねない。

しかし、一度覚えたLINQの味はもう忘れられないぞ。さて困った。LINQ .NET Framework 2.0 を両立する方法はないものか・・・。


・・・ありました!
C# 3.0 による .NET 2.0 アプリケーション開発 - XNA で LINQ を使おう - NyaRuRuが地球にいたころ


ただ、上記のNyaRuRuさんのページにも書かれているように、これはかなりの暗黒面。なんといっても、System.Linq 名前空間内のクラスを自前で用意して詐称してしまうわけだから。というわけでちょっと迷ったのだけれど、、、
思い切って作ってみた!

PseudoLinq とは

.NET Framework 3.5 より加わった System.Linq.Enumerable クラスを独自に実装したものです。PseudoLinq を使用することにより、.NET Framework 2.0 でも LINQ の機能が利用できるようになります。

株式会社カタッチ / 製品 / PseudoLinq

興味ある方は、上記のページからダウンロードしてみて欲しい。PseudoLinq.dll を参照設定すれば、.NET Framework 2.0 でも LINQ (の一部)が使用できる。また、ソースコードも含めて修正BSDライセンスで配布しているので、バグなど発見された方はフィードバックなど頂けると嬉しいな、と思っている(このページのコメント欄でもOKです)。

なお、当然(?)System.Linq 配下を全て実装したわけじゃないので悪しからず。実装が面倒なものとか、僕の知識が足りないところは実装していない。Expression Trees とか僕には手におえないし、GroupBy とか LoopUpとかもよく分からんのでパス!誰か実装して〜(ぉぃ。

まあ、気が向いたら実装を追加していきたいと思っているけど、とりあえず現時点で公開。


近いうちに、これを利用して .NET Framework 2.0 でも動作するヒスイをリリースしたいと考えている。

余談

最初は、「こんなの .NET Reflector で逆アセンブルしまくってコピーすりゃ簡単じゃん、へっへっへ」などと極悪なことを考えていたのだけれど、その目論見はあえなく失敗。yield return を使っているコードだと .NET Reflector は元のコードには逆アセンブルできないのね・・・。Enumerable の中身は yield return しまくりだから全然使えなかったよ・・・。

ちょ、ちょっと待った!

あーっ、今気づいた、コレ・・・orz。もしかして俺、すっげー無駄な努力したのか・・・。赤っ恥。
Enumerableならあります - ものがたり(旧)
そうかー、monoのソースがあるんだった・・・。涙出てきた。