如何使用参数化的FirstOrDefault()方法?

时间:2013-10-22 09:24:42

标签: c#

实际上我通过以下方式使用了FirstOrDefault()。

var product = products.FirstOrDefault((p) => p.Id == id);

我无法弄清楚p是什么以及它是如何工作的。

3 个答案:

答案 0 :(得分:2)

构造

(p) => p.Id == id

是一个lambda函数,也称为匿名函数。它需要一个名为p的参数,由编译器推断出一个类型,并返回表达式p.Id == id的值,从周围的范围中取idFirstOrDefault依次在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 productsproducts时,IEnumerable<TSource>必须为TSource predicate。编译器检查是否遵守了此要求,并知道第二个参数TSource是一个带有p参数的函数。这就是TSource的类型。

编译器根据您调用方法的参数确定类型{{1}}的类型的过程称为type inference