LINQ 是一个有趣的野兽。
讨论 LINQ 时立即IEnumerable<T>
想到。这似乎IEnumerable<T>
是LINQ,但事实并非如此。IEnumerable<T>
是 LINQ 方法的一种实现,它允许针对实现IEnumerable<T>
.
另一个实现是IObservable<T>
为 Microsoft 的响应式扩展提供支持。这是一组扩展,允许针对事件(或数据流)编写 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 查询感觉很自然——因此这就是为什么IEnumerable<T>
,并且IObservable<T>
是 LINQ 实际应用的好例子。但是,只需实现正确的方法,就可以针对您喜欢的任何类型定义 LINQ。