2011-01-10 31 views
0

我想知道其表達是更快和哪一個是優選的:Linq,lambda - 哪個語句更快?

myList.Select(a => a.Property) 
     .Where(a => !String.IsNullOrEmpty(a)) 

myList.Where(a => !String.IsNullOrEmpty(a.Property)) 
     .Select(a => a.Property) 

當然爲什麼和?

通常我的問題是:我應該使用Where後跟SelectSelect後跟Where

+3

它們不一樣,也沒有編譯。第二個應該是`a =>!string.IsNullOrEmpty(a.Property)` – Kobi 2011-01-10 13:26:07

+0

固定代碼,它幾乎肯定應該是。 – 2011-01-10 14:31:29

+0

@Eamon - 差不多,我拿出了一個額外的`a =>`。謝謝! – Kobi 2011-01-10 16:13:11

回答

1

沒有人可以知道,你必須測量。考慮一個包含50個項目的清單,其中40個項目符合過濾標準。

然後項目過濾,這種方法最大限度地減少了訪問a.Property的次數。 100個匿名方法調用和50個屬性訪問。

myList 
    .Select(a => a.Property) 
    .Where(a => !String.IsNullOrEmpty(a)) 

然後篩選項目,此方法可以最大限度地減少對匿名方法的調用次數。 90個匿名方法調用和90個屬性訪問。

myList 
    .Where(a => !String.IsNullOrEmpty(a.Property)) 
    .Select(a => a.Property) 

因爲我們不知道你的財產的執行VS匿名方法調用的成本費用,有沒有辦法來思考的性能差異。

1

我更喜歡第二個,你首先過濾數據(使用Where),然後選擇(使用Select)你想要的數據。

根據您過濾的數據性能可能會有所不同,但我覺得第二個更流行。

0

它取決於Linq提供程序。

例如在Linq2Sql中,兩個語句都是相同的,因爲thwy會針對數據庫生成相同的SQL。

在Linq2Objects中,它可能表現不同。

0

這並不重要。在上述情況下,「查詢」的其餘部分僅引用投影數據,不妨先投影並過濾。

請注意,情況並非如此,首先過濾一定會更快;通過首先調用Select,您將會執行更少的屬性訪問器 - 但兩者的差別可能很小。

如果您要編寫更復雜的查詢,我建議您儘可能快地減少數據的範圍,在這種情況下意味着在Where之前寫入Select:這會導致代碼更短在更長的查詢中可讀:畢竟,只關注相關位(這裏是字符串),讀者可以在查詢的其餘部分忽略包含它們的更復雜的對象。但是,對於這樣一個小的查詢,這個優點是毫無意義的。