実際、私は次のように 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>TSourcepredicateTSourcep
TSourceメソッドを呼び出す引数に基づいてコンパイラが型を判断するプロセスは、型推論と呼ばれます。
メソッド内のラムダ式FirstOrDefaultは、メソッドが使用されるコレクションに適用されます。
言い換えると、xyz.FirstOrDefault()または使用するxyz.FirstOrDefault(*lambda*)と、FirstOrDefault が xyz に適用されます。ラムダがある場合は、オプションをさらに絞り込みます。だからその場合
xyz.FirstOrDefault(p => p.Id == id)
これは単に、xyzコレクションから、そのアイテムの が変数Idと等しい最初のアイテムを取得するか、何もない場合は (デフォルト) を取得することを意味します。idnull
もっと簡単に言うと、xyzコレクションから、 の最初のアイテムをId == idください、または をくださいnull。