2010-11-16 47 views
1

我重構了一些LINQ查詢,我試圖確定最有效的重構。返回Func <bool>或返回bool的方法更有效嗎?

原始線是相似於查詢:

static void Main() { 
    var list = new List<string> { "A", "BB", "CCC" }; 
    var shortList = list.Any(name => name.Length == 1); 
    } 

我可以重構出字符串長度檢查的方法如下:

static void Main() { 
    var list = new List<string> { "A", "BB", "CCC" }; 
    var shortList = list.Any(name => IsShort(name)); 
    } 

    private static bool IsShort(string name) { 
    return name.Length == 1; 
    } 

OR,我可以重構出完整的函數功能到一個方法:

static void Main() { 
    var list = new List<string> { "A", "BB", "CCC" }; 
    var shortList = list.Any(IsShortFunc()); 
    } 

    private static Func<string, bool> IsShortFunc() { 
    return name => name.Length == 1; 
    } 

問題是,這在運行時更有效嗎?

+0

測量三個版本!請記住,有一個功能是有用的重用;-) – 2010-11-16 07:57:34

回答

0

你基本上是在使用所有這些情況Func<string,bool>。目前您的查詢開始執行時,您的代理已經準備就緒,它並不重要,如果你使用了匿名委託,一個命名的方法,或者一些其他的方法來創建此相同的委託。

第二個例子應該比別人稍微慢一些,因爲你做的很多電話到IsShort方法。在其他兩個示例中內聯了相同的條件,所以您沒有多次調用方法的開銷。

在最後一個例子,IsShortFunc()方法只被調用一次,並創建一個匿名委託,然後將其用於查詢的其餘部分。在這種情況下,這是一個不必要的抽象層次。

3

其實你可以做的更好比使用方法組轉換構建委託:

static void Main() { 
    var list = new List<string> { "A", "BB", "CCC" }; 
    var shortList = list.Any(IsShort); 
} 

private static bool IsShort(string name) { 
    return name.Length == 1; 
} 

這將有間接的比你的第一個解決方案少了一個水平,它更可讀(IMO)比你的第二個版本。如果你不認爲在高階功能,不要:)

我希望效率的差異是絕對微乎其微。除非您有充分的證據表明最易讀的解決方案不能滿足您的需求,否則您應該專注於可讀性。

+0

謝謝喬恩。這非常有意義且非常可讀。總有另一種方式! – axeman 2010-11-17 04:49:12

0

有比性能在所有情況下expresiveness更多這樣做的另一種方式,你可以簡單地說

static void Main() { 
var list = new List<string> { "A", "BB", "CCC" }; 
var shortList = list.Any(IsShortFunc); 
} 

private static bool IsShortFunc(string name) { 
    return name.Length == 1; 
} 

不過,我會珍惜的可讀性,所以我乾脆選擇的解決方案,你(和其他人)會感到最舒服的閱讀。