2013-10-22 21 views
1

其實我以下面的方式遇到了FirstOrDefault()的用法。如何使用參數化的FirstOrDefault()方法?

var product = products.FirstOrDefault((p) => p.Id == id); 

我不能夠做什麼,p是和如何工作的。

+6

p是迭代產品的一個元素。這是類型推斷。編譯器自己理解'p'的類型,而不必明確說明它。 –

回答

0

FirstOrDefault方法內部的lambda表達式適用於使用該方法的集合。

換句話說:當您使用xyz.FirstOrDefault()xyz.FirstOrDefault(*lambda*)時,FirstOrDefault適用於xyz。如果有lambda表達式,則會進一步縮小選項範圍。所以在情況

xyz.FirstOrDefault(p => p.Id == id)

這只是意味着從xyz集合,你拿的第一個項目,其中該項目的Id等於id變量,或者你的情況下,採取null(默認)空無一人。

更簡單地說:從xyz集合,給我第一項Id == id,或給我null

2

將構建

(p) => p.Id == id 

是一個lambda函數,也稱爲匿名函數。它需要一個參數,稱爲p,由編譯器推斷出一個類型,並返回表達式p.Id == id的值,取周圍範圍的idFirstOrDefault依次在products的每個元素上執行它,傳遞每個元素作爲參數。一旦它返回true,FirstOrDefault將從products返回該元素,並且不會進一步遍歷該集合。如果沒有元素導致真實的結果,它將返回元素類型的默認值,它是null,除非它是值類型。

0

FirstOrDefault是一種擴展方法。這個特殊的過載的簽名是

public static TSource FirstOrDefault<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, bool> predicate 
) 

這意味着,當sourceproducts在您的來電,products必須爲TSource一些價值IEnumerable<TSource>。編譯器檢查是否遵守了這個要求,並知道第二個參數predicate是一個採用TSource參數的函數。這就是p的類型。

編譯器確定類型TSource基於調用方法的參數的過程稱爲type inference

相關問題