LINQ は興味深い野獣です。
IEnumerable<T>
LINQ について議論するとき、すぐに頭に浮かびます。LINQのようですIEnumerable<T>
が、そうではありません。IEnumerable<T>
は、 を実装するオブジェクトに対して LINQ クエリを記述できるようにする LINQ メソッドの 1 つの実装ですIEnumerable<T>
。
もう 1 つの実装はIObservable<T>
、Microsoft の Reactive Extensions を強化するものです。これは、LINQ クエリをイベント (またはデータ ストリーム) に対して記述できるようにする一連の拡張機能です。とは関係ありませんIEnumerable<T>
。
LINQ は、オブジェクトに直接記述することもできます。拡張メソッドである必要はまったくありません。
たとえば、クラスA
をB
次のように定義します。
public class A
{
public B Select(Func<A, B> selector)
{
return selector(this);
}
}
public class B
{
public B(A a) { }
}
今、私はこのコードを書くことができます:
B query =
from x in a
select new B(x);
それは LINQ、Jim ですが、私たちが知っているようなものではありません。
すべての LINQ 演算子は、この方法で定義できます。コンパイラが正しいシグネチャを持つメソッドを認識できる限り、あなたは成功しています。
この LINQ クエリは、一連の値を操作するときに自然に感じられると言われています。したがって、これがLINQIEnumerable<T>
のIObservable<T>
動作の良い例です。しかし、適切なメソッドを実装するだけで、好きな型に対して LINQ を定義することは確かに可能です。