实际上我通过以下方式使用了FirstOrDefault()。
var product = products.FirstOrDefault((p) => p.Id == id);
我无法弄清楚p是什么以及它是如何工作的。
答案 0 :(得分:2)
构造
(p) => p.Id == id
是一个lambda函数,也称为匿名函数。它需要一个名为p
的参数,由编译器推断出一个类型,并返回表达式p.Id == id
的值,从周围的范围中取id
。 FirstOrDefault
依次在products
中的每个元素上执行它,并将每个元素作为参数传递。它返回true的那一刻,FirstOrDefault
将从products
返回该元素,并不再遍历该集合。如果没有元素导致真实结果,则返回元素类型的默认值,即null
,除非它是值类型。
答案 1 :(得分: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 :(得分:0)
FirstOrDefault
是一种扩展方法。这个特殊重载的签名是
public static TSource FirstOrDefault<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
这意味着当source
products
为products
时,IEnumerable<TSource>
必须为TSource
predicate
。编译器检查是否遵守了此要求,并知道第二个参数TSource
是一个带有p
参数的函数。这就是TSource
的类型。
编译器根据您调用方法的参数确定类型{{1}}的类型的过程称为type inference。