LINQ是一個有趣的野獸。在討論LINQ時,想起了。看來,IEnumerable<T>
是 LINQ,但它不是。 IEnumerable<T>
是LINQ方法的一個實現,它允許針對實現IEnumerable<T>
的對象寫入LINQ查詢。
另一種實現方式是IObservable<T>
,它爲微軟的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,吉姆,而不是我們所知道的。
所有的LINQ操作符都可以這樣定義。只要編譯器能夠看到具有正確簽名的方法,您就是黃金。
說了這個LINQ查詢在處理一系列值時感覺很自然 - 因此這就是爲什麼IEnumerable<T>
和IObservable<T>
是LINQ在行動中的好例子。但是,只要通過實施正確的方法,就可以將LINQ定義爲任何你喜歡的類型。
LINQ是**不是** IEnumerable對象的一組擴展。實際上它甚至不是'IEnumerable'的一組擴展。你已經定義了它的背後。應該是'IEnumerable 'LINQ擴展實現了使用LINQ所需的方法。 –
Enigmativity