4

Predicates と LINQ について頭を悩ませようとしています。

LINQ の構文は理解できるようになりつつありますが、LINQ の背後にある理論については少し問題があります。

これが私がこれまでに持っているものです。LINQ を設計するとき、LINQ を使用してクエリできるオブジェクトを実装する必要がある各メンバーを定義する新しいインターフェイスを作成する代わりに、Microsoft は代わりに既存のクラス IEnumerable を取得し、拡張メソッドを使用してこのクラスを拡張することにしました。

拡張メソッドを理解していると思います。拡張メソッドは、静的クラス内の静的メソッドです。このメソッドに渡される最初のパラメーターは、thisパラメーターと共に渡され、拡張される型を定義します。次に、拡張メソッドと同じ名前空間内のこの型のインスタンスは、メソッドを利用できます。

そのため、Microsoft は、System.LINQ 名前空間内で IEnumerable を拡張する多数の拡張メソッドを作成しました。System.LINQ 名前空間を使用し、IEnumerable を実装するオブジェクトを含むすべてのクラスは、これらの拡張メソッドを使用してそのオブジェクトをクエリできます。これらの各拡張メソッドは、2 番目のパラメーターとしてデリゲートを受け取ります。

に関してはwhere、 IEnumerable を拡張し、 whereIEnumerable を実装する新しいオブジェクトを返す拡張メソッドです。次のパラメーターwhereは、Func (ジェネリック func) 型の述語 (ブール値を返すメソッド) です。これはデリゲートで、true または false を返し、最大 16 個のパラメーターを受け取ることができます。ただし、この基準を満たすメソッドを記述し、 Func 型のインスタンスを作成してメソッドに向け、この変数をwhereメソッドに渡す必要はなく、C# を使用すると、これをオンザフライで記述できます。LINQ クエリを作成するときに単語の後に置くものはすべてwhere、述語になります。

バックグラウンドで、IEnumerable を実装するオブジェクトのメンバーが繰り返され、述語に対して評価されます。if は、構文trueを使用して新しい IEnumerable オブジェクトに追加されます。yield return

これが少しまとまりがないように見える場合は申し訳ありませんが、基本的に私はそれを理解しているので、基本的にすべてを脳から吐き出しました.ここで何が起こっているのかを正しく理解するのに少し苦労しているので、上で書いたことを一般的に拡張します。

4

2 に答える 2

2

そのため、Microsoft は System.LINQ 名前空間内で IEnumerable を拡張する多数の拡張メソッドを作成しました。System.LINQ 名前空間を使用し、IEnumerable を実装するオブジェクトを含むすべてのクラスは、これらの拡張メソッドを使用してそのオブジェクトをクエリできます。これらの各拡張メソッドは、2 番目のパラメーターとしてデリゲートを受け取ります。

私が注目したいのは次の2つです。

  1. すべてのメソッドがデリゲートをパラメーターとして受け取るわけではありません。たとえば、Skip(int count)、Take (int count)、Concat(IEnumerable second) などです。
  2. System.Linq はLINQの1 つの実装にすぎないため、拡張メソッドを使用します。DBクエリなどを実行している場合は、代わりにMongoDB.Driver.Linqを使用するように交換できます.
于 2012-08-05T05:47:37.863 に答える