[英]Are the following Lambda and Linq expressions equivalent?
以下Lambda和Linq表達式在執行路徑方面是否相同? 我想我想知道Linq是否會以不同的方式運行,因為它會在確定枚舉中是否有任何內容之前創建一個IEnumerable,而lambda表達式將在它找到的第一個數字上停止。
var x = valueToMatch
.Any(c => Char.IsDigit(c));
var y = (from c in valueToMatch
select c).Any(c => Char.IsDigit(c)); here
謝謝! 喬爾
它將以不同的方式運行,但不會以任何可觀的方式運行 如果使用MSIL反匯編程序 ,即使啟用了優化,第一個表達式和第二個表達式的輸出也會略有不同。 您也可以使用Reflector (它更容易閱讀)來查看它。
第二個版本基本上會通過以下內容傳遞每個元素:
[CompilerGenerated]
private static char <Match2>b__2(char c)
{
return c;
}
在它執行Any(c => Char.IsDigit(c))表達式之前。 所以確實存在差異。
但是,我認為差異非常小。 使用每種方法測試10,000個字符的循環超過10,000,000的列表,第一個在~125ms左右計時,而第二種方法需要~185ms。
它們大致相同。
編譯器可能會優化選擇,兩者將100%相同。
無論如何,Linq是懶惰評估的,因此在兩種情況下,valueToMatch將被枚舉完全相同的數量。
對於查詢表達式,這表示標識函數 :
from c in valueToMatch select c
這意味着表達式的結果將完全等於輸入matchToValue
。 因此,您提供的示例在語義上是等效的。
在非身份選擇的情況下,例如:
from c in valueToMatch select c + ";"
創建一個IEnumerable<char>
, 當枚舉時 ,它將使用valueToMatch
的內容並更改它們。
這個電話:
(from c in valueToMatch select c + ";").Any(c => Char.IsDigit(c))
枚舉內部查詢,直到找到匹配項。 正如您所看到的,無論源查詢如何,在調用Any
之前都不會運行。 IEnumerable<char>
實例表示運行查詢的能力,而不是已經運行的查詢。 這個概念稱為延遲執行 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.