2011-07-21 45 views
2

當使用像Enumerable.Select這樣的LINQ擴展方法時,最好使用Lambda表達式還是常規方法?LINQ擴展方法:使用Lambda表達式還是方法?

我在(內存)優化*和可讀性**方面都提出這個問題。

示例代碼:

private void Main() { 
    var array = new int[1]; 
    var result1 = array.Select(x => x.ToString()); // Lambda 
    var result2 = array.Select(LinqHelper); // method 
} 

private string LinqHelper(int x) { 
    return x.ToString(); 
} 


* 我主要想關閉創建與他們未使用的實例變量的作用域,僅僅是因爲這些變量在作用域時拉姆達創建 。編輯 - 這是愚蠢的想法,因爲只有在Lambda表達式中引用變量時纔會捕獲變量。
**這兩個選項對我來說都不錯。

+0

在不同情況下都有各自的優點 - 但正如您所說,爲了便於閱讀,請不要將方法命名爲「LinqHelper」。將它命名爲對讀者有價值的東西。 =)是的,我意識到這是一個例子,但仍然如此。對於後人... –

+0

哦,我同意,但我認爲這種類型的命名對於StackOverflow閱讀器更有價值;更容易掌握正在發生的事情。 –

+1

是的!理解上下文。這項業務非常有價值。 ;) –

回答

3

從優化的角度來看,應該沒有區別。

從可讀性的角度來看,我會考慮在幾個地方是否需要相同的邏輯。如果是這樣,請使用方法並使用方法組轉換。這樣你就不會重複自己,所以如果你的需求改變了,你不需要改變幾位代碼。

如果你只在一個地方使用邏輯,並且它很短,lambda表達式通過一種通常易於讀取IMO的方式捕獲邏輯「inline」。

我通常會避免使用long lambda表達式,其中TPL可能有例外,例如TPL。

Parallel.ForEach(..., x => { 
    // I'm quite happy to have a long-ish lambda here - it's like a foreach 
    // loop body, basically. 
});