实际上,我通过以下方式遇到了 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编译器根据您调用方法的参数来确定类型的过程称为类型推断。