1

实际上,我通过以下方式遇到了 FirstOrDefault() 的用法。

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

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

4

3 回答 3

2

构造

(p) => p.Id == id

是一个 lambda 函数,也称为匿名函数。它接受一个参数,称为p,由编译器推断的类型,并返回表达式的值p.Id == idid取自周围的范围。依次FirstOrDefault在每个元素上执行它,将每个元素作为参数传递。products它返回 true 的那一刻,FirstOrDefault将从中返回该元素products并且不再遍历集合。如果没有元素导致结果为真,则返回元素类型的默认值,null除非它是值类型。

于 2013-10-22T09:30:11.603 回答
0

方法内的 lambda 表达式FirstOrDefault适用于使用该方法的集合。

换句话说:当你使用xyz.FirstOrDefault()orxyz.FirstOrDefault(*lambda*)然后 FirstOrDefault 适用于 xyz。如果有 lambda,它会进一步缩小选择范围。所以在这种情况下

xyz.FirstOrDefault(p => p.Id == id)

这仅仅意味着从xyz集合中,您获取该Id项目的等于id变量的第一个项目,或者您获取null(默认值)以防万一。

更简单的说:从xyz收藏中,给我第一项在哪里Id == id,或者给我null

于 2013-10-22T09:30:47.050 回答
0

FirstOrDefault是一种扩展方法。这种特殊重载的签名是

public static TSource FirstOrDefault<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

这意味着 whensourceproducts您的电话中,products必须是 的IEnumerable<TSource>某个值TSource。编译器检查这个要求是否被遵守并且知道第二个参数predicate是一个带TSource参数的函数。这就是类型p

TSource编译器根据您调用方法的参数来确定类型的过程称为类型推断

于 2013-10-22T09:33:11.313 回答