実際、私は次のように FirstOrDefault() の使用法に遭遇しました。
var product = products.FirstOrDefault((p) => p.Id == id);
p が何であり、これがどのように機能するかを理解できません。
実際、私は次のように FirstOrDefault() の使用法に遭遇しました。
var product = products.FirstOrDefault((p) => p.Id == id);
p が何であり、これがどのように機能するかを理解できません。
コンストラクト
(p) => p.Id == id
無名関数とも呼ばれるラムダ関数です。p
コンパイラによって推論される型のと呼ばれる 1 つのパラメーターp.Id == id
を取りid
、周囲のスコープから取得した式の値を返します。FirstOrDefault
各要素に対して順番に実行し、各要素products
をパラメーターとして渡します。true が返された瞬間に、FirstOrDefault
その要素が返されproducts
、コレクションを反復処理しなくなります。どの要素も真の結果をもたらさnull
ない場合、値型でない限り、要素型の既定値を返します。
FirstOrDefault
拡張メソッドです。この特定のオーバーロードのシグネチャは
public static TSource FirstOrDefault<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
これは、 whensource
がproducts
呼び出しのように、の何らかの値の であるproducts
必要があることを意味します。コンパイラは、この要件が満たされていることを確認し、2 番目のパラメーターが引数を取る関数であることを認識します。それがのタイプです。IEnumerable<TSource>
TSource
predicate
TSource
p
TSource
メソッドを呼び出す引数に基づいてコンパイラが型を判断するプロセスは、型推論と呼ばれます。
メソッド内のラムダ式FirstOrDefault
は、メソッドが使用されるコレクションに適用されます。
言い換えると、xyz.FirstOrDefault()
または使用するxyz.FirstOrDefault(*lambda*)
と、FirstOrDefault が xyz に適用されます。ラムダがある場合は、オプションをさらに絞り込みます。だからその場合
xyz.FirstOrDefault(p => p.Id == id)
これは単に、xyz
コレクションから、そのアイテムの が変数Id
と等しい最初のアイテムを取得するか、何もない場合は (デフォルト) を取得することを意味します。id
null
もっと簡単に言うと、xyz
コレクションから、 の最初のアイテムをId == id
ください、または をくださいnull
。