2011-09-02 71 views
1

我想有一個擴展方法使用擴展方法與lambda表達式在c#

public static IEnumerable<Product> Filter(
    this IEnumerable<Product> productEnum, 
    Func<Product, bool> selectorParam) 
    { 
     return productEnum.Where(selectorParam); 
    } 

我稱之爲像這樣

Func<Product, bool> languageFilter = prod => prod.Language == lang; 

哪個如果即時沒有misaken在功能上相同

var products = Products.Where(q => q.Language == parameter); 

我想了解什麼時候可以利用擴展方法按照第一個樣本,以及何時對我們e linq語法。

回答

2

我認爲你混淆了一些術語。該Filter方法您展示的是一個擴展方法(在參數列表中的this關鍵字這樣指出。你所terming爲「LINQ語法」實際上是一個lambda表達式。

所有的LINQ方法的擴展來實現調用的方法和支持兩個「風格」:

  1. 其實直接撥打電話,好像他們是被擴展類型的一部分的擴展方法這是你展示什麼叫它爲productEnum.Where(selectorParam)

  2. 。使用更像SQL的sy ntax,稱爲LINQ查詢語法。請記住,編譯器會翻譯此類SQL語法以實際調用擴展方法。

當定義Func<Product, bool> languageFilter = prod => prod.Language == lang;,實際上限定了lambda表達式並將其分配給Func<Product, bool>類型的變量(languageFilter)。Products.Where(q => q.Language == parameter);語句完全相同,只不過在變量中捕獲lambda表達式只需將其傳遞給擴展方法即可。

爲了您例如,使用LINQ查詢語法來得到相同的結果,你會寫類似

from p in Products 
where p.Language == parameter 

(假設參數別處定義)

+0

好要嚴格對術語我會說,由LambdaExpression表示的匿名函數被分配給變量。畢竟你也可以自己分配表達式。 IE瀏覽器。表達式> = ... –

+0

謝謝,很好的解釋。 – MikeW

1

在內部,linq語法被分解爲擴展方法,所以在功能上沒有區別。如果你有一個Filter擴展方法,那麼使用第一個表單可能沒有什麼意義(我假設你的問題是不完整的)。但是,假設您需要在Filter方法中執行一些常用的邏輯,您不希望在where子句的每個實例中反覆重複。在這種情況下,構建自定義擴展方法是有意義的,以便您可以重用該邏輯。

例如,我們假設我們只處理尚未過期的產品(假設您的Product對象具有isExpired屬性)。因爲,你很可能要在這些未到期的產品進一步幾個selectorParam值過濾,你可以使用:

public static IEnumerable<Product> Filter(
    this IEnumerable<Product> productEnum, 
    Func<Product, bool> selectorParam) 
    { 
     return productEnum.Where(x => !x.IsExpired).Where(selectorParam); 
    } 

所以不要叫products.Where(x => !x.IsExpired).Where(q => q.Language == parameter)products.Where(x => !x.IsExpired).Where(q => q.Price > parameter)

你可以只使用:
products.Filter(q => q.Language == parameter)products.Filter(q => q.Price > parameter)

1

我想如果在框架中已經有一個擴展方法來做你想做的事情,那就使用它。 'Where'方法也是一種擴展方法,不是你寫的。我的理由是'那些聰明的微軟隊可能比我以前做得更好'。