12

私はLuaのためにLinqのようなものを作ることを考えていました、そして私はLinqがどのように機能するかについて一般的な考えを持っていますが、良い記事があるかどうか、または誰かがC#がLinqを可能にする方法を説明できるかどうか疑問に思いました

注:エンドユーザーの構文ではなく、コードバインディングなどを生成する方法など、舞台裏を意味します。

4

6 に答える 6

18

LINQは非常に多くの異なるものであるため、質問に答えるのは困難です。たとえば、C#に固執すると、次のことが関係します。

  • クエリ式は「クエリ式なしのC#」に「前処理」され、通常どおりコンパイルされます。仕様のクエリ式の部分は非常に短いです。これは基本的に機械的な変換であり、「orderbyはOrderBy/ ThenBy / etcに変換される」以外は、クエリの実際の意味について何も想定していません。
  • デリゲートは、実行可能コードとして、特定の署名を持つ任意のアクションを表すために使用されます。
  • 式ツリーは同じものを表すために使用されますが、データとして使用されます(SQLなどの別の形式に調べて変換することができます)
  • ラムダ式は、ソースコードをデリゲートまたは式ツリーに変換するために使用されます。
  • 拡張メソッドは、静的メソッド呼び出しをチェーン化するためにほとんどのLINQプロバイダーによって使用されます。これにより、シンプルなインターフェイス(例IEnumerable<T>)でより多くの電力を効果的に得ることができます。
  • 匿名タイプはプロジェクションに使用されます。データの異なるコレクションがあり、そのデータの各側面のビットが必要な場合、匿名タイプを使用すると、それらをまとめることができます。
  • 暗黙的に型付けされたローカル変数(var)は、主に匿名型を操作するときに使用され、型の名前を明示的に「話す」ことができない静的に型付けされた言語を維持します。
  • イテレータブロックは通常、LINQ to Objectsなど、インプロセスクエリを実装するために使用されます。
  • 型推論は、全体を非常にスムーズにするために使用されます。LINQには多くのジェネリックメソッドがあり、型推論がないと非常に苦痛になります。
  • コード生成は、モデル(DBMLなど)をコードに変換するために使用されます
  • 部分型は、生成されたコードに拡張性を提供するために使用されます
  • 属性は、LINQプロバイダーにメタデータを提供するために使用されます

明らかに、これらの多くはLINQで使用されるだけでなく、さまざまなLINQテクノロジがそれらに依存します。

あなたが興味を持っている側面についてより多くの指標を与えることができれば、私たちはより詳細を提供することができるかもしれません。

LINQ to Objectsを効果的に実装することに興味がある場合は、数週間前にDDDで行ったReadingの講演に興味があるかもしれません。基本的には1時間でできるだけ多くのLINQtoObjectsを実装します。私たちはそれの終わりまでには完全にはほど遠いものでしたが、あなたがしなければならないことの種類(そしてバッファリング/ストリーミング、イテレータブロック、クエリ式の変換など)についてかなり良いアイデアを与えるはずです。ビデオはまだアップしていません(そして私はまだダウンロード用のコードをアップしていません)が、興味があれば、skeet@pobox.comにメールを送ってください。アップしたときにお知らせします。 。(私もおそらくそれについてブログを書きます。)

于 2008-12-02T07:19:00.337 に答える
3

Mono(部分的に?)はLINQを実装し、オープンソースです。多分あなたはそれらの実装を調べることができますか?

于 2008-12-02T07:16:40.547 に答える
2

この記事を読む:

カスタムLINQプロバイダーを作成する方法を学ぶ

于 2008-12-02T07:17:07.707 に答える
2

おそらく、私のLINQforR6RSスキームはいくつかの洞察を提供します。

これは、意味的には100%、構文的にはLINQとほぼ同じですが、「、」の代わりに「then」を使用する追加の並べ替えパラメーターを除きます。

いくつかのルール/仮定:

  • リストのみを扱い、クエリプロバイダーは扱いません。
  • 怠惰ではありませんが、熱心な理解。
  • Schemeは静的型を使用しないため、静的型はありません。

私の実装は、いくつかのコア手順に依存しています。

  • マップ-「選択」に使用
  • filter-'Where'に使用されます
  • flatten-「SelectMany」に使用
  • sort-マルチキーソート手順
  • groupby-構成をグループ化するため

構造の残りの部分はすべて、マクロを使用して構築されます。

バインディングは、衛生を確保するためにバインドされた識別子でタグ付けされたリストに格納されます。バインディングは抽出され、式が発生するたびにローカルでリバウンドされます。

私は自分のブログで進捗状況を追跡しました。これにより、考えられる問題についての洞察が得られる可能性があります。

于 2008-12-02T07:39:16.973 に答える
2

デザインのアイデアについては、Linq を生み出した研究プロジェクトであるc omegaをご覧ください。Linq は、視点に応じて、より実用的な、または骨抜きにされた c omega のバージョンです。

于 2008-12-02T09:58:44.307 に答える
1

Matt Warren のブログには、すべての答え (および、有利なスタートを切るための IQueryable プロバイダーの実装のサンプル) があります。

http://blogs.msdn.com/mattwar/

于 2008-12-02T09:15:32.210 に答える