簡體   English   中英

以下Lambda和Linq表達式是否相同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM