何时使用. First 以及何时将. FirstOrDefault 与 LINQ 结合使用?

我到处搜索,还没有真正找到关于何时要使用.First以及何时要将.FirstOrDefault与 LINQ 结合使用的明确答案。

  • 您什么时候要使用.First ?仅当您希望在没有返回结果的情况下捕获异常时?

    var result = List.Where(x => x == "foo").First();
  • 以及何时要使用.FirstOrDefault ?如果您始终想要默认类型(如果没有结果)?

    var result = List.Where(x => x == "foo").FirstOrDefault();
  • 那么,Take 呢?

    var result = List.Where(x => x == "foo").Take(1);

答案

当我知道或期望序列具有至少一个元素时,我将使用First() 。换句话说,当序列异常为空时,则为空。

当您知道需要检查是否有元素时,请使用FirstOrDefault() 。换句话说,在合法的情况下,序列为空。您不应依赖异常处理来进行检查。 (这是不好的做法,可能会损害性能)。

最后, First()Take(1)之间的区别在于, First()返回元素本身,而Take(1)返回一系列元素,其中仅包含一个元素。

如果没有结果,则.First将引发异常。 .FirstOrDefault不会,它只会返回 null(引用类型)或值类型的默认值。 (例如,对于 int 来说为0 )这里的问题不是当您想要默认类型时,而是更多:您愿意处理异常还是处理默认值?由于异常应该是例外, FirstOrDefault在不确定是否要从查询中获取结果时,首选FirstOrDefault 。当逻辑上数据应该存在时,可以考虑异常处理。

设置结果分页时通常使用Skip()Take() 。 (例如,显示前 10 个结果,以及下一页上的后 10 个结果,等等)

希望这可以帮助。

如果没有要返回的行, .First()将引发异常,而.FirstOrDefault()将返回默认值(所有引用类型为NULL )。

因此,如果您准备好并愿意处理可能的异常,则.First()很好。如果您还是想检查!= null的返回值,那么.FirstOrDefault()是更好的选择。

但是我想这也是个人喜好。使用对您更有意义的代码,更好地适合您的编码风格。

第一()

  1. 返回序列的第一个元素。
  2. 当结果中没有元素或源为 null 时,它将引发错误。
  3. 如果需要多个元素,并且只需要第一个元素,则应使用它。

FirstOrDefault()

  1. 返回序列的第一个元素,如果找不到元素,则返回默认值。
  2. 仅当源为 null 时,它才会引发错误。
  3. 如果需要多个元素,并且只需要第一个元素,则应使用它。如果结果为空也很好。

我们有一个 UserInfos 表,其中包含一些记录,如下所示。根据下表,我创建了示例...

用户信息表

如何使用 First()

var result = dc.UserInfos.First(x => x.ID == 1);

只有一条记录,其中 ID ==1。应返回此记录
ID:1 名:Manish 姓:Dubey 电子邮件:xyz@xyz.com

var result = dc.UserInfos.First(x => x.FName == "Rahul");

有多个记录,其中 FName ==“Rahul”。第一条记录应该返回。
ID:7 名:Rahul 姓:Sharma 电子邮件:xyz1@xyz.com

var result = dc.UserInfos.First(x => x.ID ==13);

没有 ID == 13 的记录。应该发生错误。
InvalidOperationException:序列不包含任何元素

如何使用 FirstOrDefault()

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);

只有一条记录,其中 ID ==1。应返回此记录
ID:1 名:Manish 姓:Dubey 电子邮件:xyz@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");

有多个记录,其中 FName ==“Rahul”。第一条记录应该返回。
ID:7 名:Rahul 姓:Sharma 电子邮件:xyz1@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);

没有 ID == 13 的记录。返回值为 null

希望它可以帮助您了解何时使用First()FirstOrDefault()

首先, Take是一种完全不同的方法。它返回一个IEnumerable<T>而不是单个T ,所以就可以了。

FirstFirstOrDefault ,如果您确定某个元素存在,则应该使用First ;否则,将出现错误。

顺便说一句,如果序列包含default(T)元素(例如null ),并且您需要区分为空和第一个元素为null ,则不能使用FirstOrDefault

第一:

  • 返回序列的第一个元素
  • 引发异常:结果中没有元素
  • 在以下情况下使用:当预期有多个元素并且只需要第一个元素时

FirstOrDefault:

  • 返回序列的第一个元素,如果找不到元素,则返回默认值
  • 引发异常:仅当源为 null 时
  • 在以下情况下使用:当预期有多个元素并且只需要第一个元素时。结果也可以为空也可以

来自: http : //www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

另一个需要注意的区别是,如果要在生产环境中调试应用程序,则可能无法访问行号,因此很难确定方法中哪个特定的.First()语句引发了异常。

异常消息也将不包含您可能使用过的任何 Lambda 表达式,这些表达式甚至会导致更难调试。

这就是为什么我总是使用FirstOrDefault()的原因,即使我知道 null 条目会构成特殊情况。

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}

第一()

当您知道该结果包含多个预期的元素时,您应该只选择序列的第一个元素。

FirstOrDefault()

FirstOrDefault()类似于 First(),不同之处在于,如果没有元素与指定条件匹配,则它返回通用集合的基础类型的默认值。如果未找到任何元素,则不会引发 InvalidOperationException。但是元素或序列的集合为空,否则会引发异常。

此类函数属于元素运算符。下面定义了一些有用的元素运算符。

  1. First / FirstOrDefault
  2. 最后 / 最后或默认
  3. 单 / 单或默认

当需要根据特定条件从序列中选择单个元素时,我们使用元素运算符。这是一个例子。

List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };

满足条件后,First()运算符返回序列的第一个元素。如果未找到任何元素,则将引发异常。

int result = items.Where(item => item == 2).First();

满足条件后,FirstOrDefault()运算符返回序列的第一个元素。如果未找到任何元素,则它将返回该类型的默认值。

int result1 = items.Where(item => item == 2).FirstOrDefault();

我找到了一个网站,称其为解释对 FirstOrDefault 的需求
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
如果查询没有结果,并且您想调用 First()或 Single()以获得单行...,您将得到 “序列不包含任何元素” 异常。

免责声明:我从未使用过 LINQ,所以我很抱歉,如果这没有实现。