实际上,我通过以下方式遇到了 FirstOrDefault() 的用法。
var product = products.FirstOrDefault((p) => p.Id == id);
我无法弄清楚 p 是什么以及它是如何工作的。
实际上,我通过以下方式遇到了 FirstOrDefault() 的用法。
var product = products.FirstOrDefault((p) => p.Id == id);
我无法弄清楚 p 是什么以及它是如何工作的。
构造
(p) => p.Id == id
是一个 lambda 函数,也称为匿名函数。它接受一个参数,称为p
,由编译器推断的类型,并返回表达式的值p.Id == id
,id
取自周围的范围。依次FirstOrDefault
在每个元素上执行它,将每个元素作为参数传递。products
它返回 true 的那一刻,FirstOrDefault
将从中返回该元素products
并且不再遍历集合。如果没有元素导致结果为真,则返回元素类型的默认值,null
除非它是值类型。
方法内的 lambda 表达式FirstOrDefault
适用于使用该方法的集合。
换句话说:当你使用xyz.FirstOrDefault()
orxyz.FirstOrDefault(*lambda*)
然后 FirstOrDefault 适用于 xyz。如果有 lambda,它会进一步缩小选择范围。所以在这种情况下
xyz.FirstOrDefault(p => p.Id == id)
这仅仅意味着从xyz
集合中,您获取该Id
项目的等于id
变量的第一个项目,或者您获取null
(默认值)以防万一。
更简单的说:从xyz
收藏中,给我第一项在哪里Id == id
,或者给我null
。
FirstOrDefault
是一种扩展方法。这种特殊重载的签名是
public static TSource FirstOrDefault<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
这意味着 whensource
在products
您的电话中,products
必须是 的IEnumerable<TSource>
某个值TSource
。编译器检查这个要求是否被遵守并且知道第二个参数predicate
是一个带TSource
参数的函数。这就是类型p
。
TSource
编译器根据您调用方法的参数来确定类型的过程称为类型推断。