2012-11-26 93 views
0

我正在尋找關於如何爲我的業務類創建LINQ訪問器/ API的優秀教程。因此,有人可能最終在一個program--創建我自己的LINQ集合

var potentialCustomers = from people in county 
        where people.NumberOfCats > 2 
        select people 

進入這樣的事情我已經使用LINQ往往不夠用的.Net集合,但也從來沒有這樣做對我自己的類。這僅僅是實現IEnumerable的問題,還是需要額外的步驟?

回答

1

你只需要在你的類中實現IEnumerable interface然後你就可以使用LINQ。
因爲LINQ是IEnumerable對象的擴展集合

+1

LINQ是**不是** IEnumerable對象的一組擴展。實際上它甚至不是'IEnumerable '的一組擴展。你已經定義了它的背後。應該是'IEnumerable 'LINQ擴展實現了使用LINQ所需的方法。 – Enigmativity

2

LINQ是一個有趣的野獸。在討論LINQ時,想起了。看來,IEnumerable<T> LINQ,但它不是。 IEnumerable<T>是LINQ方法的一個實現,它允許針對實現IEnumerable<T>的對象寫入LINQ查詢。

另一種實現方式是IObservable<T>,它爲微軟的Reactive Extensions提供動力。這是一組允許LINQ查詢針對事件(或數據流)寫入的擴展。與IEnumerable<T>無關。

LINQ也可以直接寫入你的對象 - 它不一定是擴展方法。

例如,定義類AB像這樣:

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定義爲任何你喜歡的類型。