其實我以下面的方式遇到了FirstOrDefault()的用法。如何使用參數化的FirstOrDefault()方法?
var product = products.FirstOrDefault((p) => p.Id == id);
我不能夠做什麼,p是和如何工作的。
其實我以下面的方式遇到了FirstOrDefault()的用法。如何使用參數化的FirstOrDefault()方法?
var product = products.FirstOrDefault((p) => p.Id == id);
我不能夠做什麼,p是和如何工作的。
FirstOrDefault
方法內部的lambda表達式適用於使用該方法的集合。
換句話說:當您使用xyz.FirstOrDefault()
或xyz.FirstOrDefault(*lambda*)
時,FirstOrDefault適用於xyz。如果有lambda表達式,則會進一步縮小選項範圍。所以在情況
xyz.FirstOrDefault(p => p.Id == id)
這只是意味着從xyz
集合,你拿的第一個項目,其中該項目的Id
等於id
變量,或者你的情況下,採取null
(默認)空無一人。
更簡單地說:從xyz
集合,給我第一項Id == id
,或給我null
。
將構建
(p) => p.Id == id
是一個lambda函數,也稱爲匿名函數。它需要一個參數,稱爲p
,由編譯器推斷出一個類型,並返回表達式p.Id == id
的值,取周圍範圍的id
。 FirstOrDefault
依次在products
的每個元素上執行它,傳遞每個元素作爲參數。一旦它返回true,FirstOrDefault
將從products
返回該元素,並且不會進一步遍歷該集合。如果沒有元素導致真實的結果,它將返回元素類型的默認值,它是null
,除非它是值類型。
FirstOrDefault
是一種擴展方法。這個特殊的過載的簽名是
public static TSource FirstOrDefault<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
這意味着,當source
是products
在您的來電,products
必須爲TSource
一些價值IEnumerable<TSource>
。編譯器檢查是否遵守了這個要求,並知道第二個參數predicate
是一個採用TSource
參數的函數。這就是p
的類型。
編譯器確定類型TSource
基於調用方法的參數的過程稱爲type inference。
p是迭代產品的一個元素。這是類型推斷。編譯器自己理解'p'的類型,而不必明確說明它。 –