何时使用.第一次以及何时使用.FirstOrDefault和LINQ?

Met*_*urf 797 .net c# linq

我已经四处寻找并且没有真正找到关于何时想要使用.First以及何时想要使用.FirstOrDefaultLINQ 的明确答案.

dri*_*iis 783

First()当我知道或期望序列至少有一个元素时我会使用.换句话说,当序列为空时出现异常情况.

使用FirstOrDefault()时,你知道你需要检查是否有一个元素或没有.换句话说,当序列为空时是合法的.您不应该依赖异常处理来进行检查.(这是不好的做法,可能会伤害表现).

最后,之间的差First()Take(1)First()返回元素本身,而Take(1)返回一个包含恰好一个要素元素的序列.

  • 抓住这个,我找到了一种更好的方法来实现它,使用:DefaultIfEmpty(-1).First() (23认同)
  • 我要添加的唯一内容是,如果您选择的类型的默认值可能是有效值,例如您的结果可能是int值0,那么处理异常似乎是处理此问题的最佳方法. (5认同)
  • Take不会返回一个元素,它最多返回一个元素(当然,如果指定1).如果序列最初为空,它也可以返回0个元素. (5认同)
  • @driis - 我想我们可以在First和FirstOrDefault之间选择时使用特殊例外指南的口头禅.谢谢你的答案. (4认同)
  • @RoyiNamir,是的,在问题的上下文中,参数取为1.我还注意到在句子后面的parens. (3认同)
  • 我认为最好先解释一下 `Take` 是如何工作的,然后解释一下 `First()` 和 `Take(1)` 是如何相同的 (2认同)

Jer*_*eer 264

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

Skip()并且Take()通常在结果中设置分页时使用.(如显示前10个结果,下一页显示下10个,等等)

希望这可以帮助.

  • @Jeroen - 使用Skip/Take的更好用例的好点. (5认同)
  • +1表示`.FirstOrDefault`将为引用类型返回null.我对"默认"对象的含义感到困惑.这个答案清除了. (4认同)

mar*_*c_s 112

如果没有要返回的行,则first()将抛出异常,而.FirstOrDefault()将返回默认值(.First()对于所有引用类型).

所以如果你准备好并愿意处理一个可能的例外,那.FirstOrDefault()很好.如果你更喜欢检查!= null的返回值,那么NULL你是更好的选择.

但我想这也是个人偏好.使用对您更有意义的东西,更好地适应您的编码风格.


Muk*_*mar 64

第一()

  1. 返回序列的第一个元素.
  2. 当结果中没有元素或源为null时抛出错误.
  3. 你应该使用它,如果预期有多个元素,你只想要第一个元素.

FirstOrDefault()

  1. 返回序列的第一个元素,如果未找到任何元素,则返回默认值.
  2. 只有在源为null时才会抛出错误.
  3. 你应该使用它,如果预期有多个元素,你只想要第一个元素.如果结果为空,也很好.

我们有一个UserInfos表,它有一些记录,如下所示.在下表的基础上,我创建了示例...

UserInfo表

如何使用First()

var result = dc.UserInfos.First(x => x.ID == 1);
Run Code Online (Sandbox Code Playgroud)

只有一条记录ID == 1.应该返回此记录
ID:1名字:Manish姓氏:Dubey电子邮件:xyz@xyz.com

var result = dc.UserInfos.First(x => x.FName == "Rahul");   
Run Code Online (Sandbox Code Playgroud)

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

var result = dc.UserInfos.First(x => x.ID ==13);
Run Code Online (Sandbox Code Playgroud)

ID == 13没有记录.应该发生错误.
InvalidOperationException:Sequence不包含任何元素

如何使用FirstOrDefault()

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);
Run Code Online (Sandbox Code Playgroud)

只有一条记录ID == 1.应该返回此记录
ID:1名字:Manish姓氏:Dubey电子邮件:xyz@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");
Run Code Online (Sandbox Code Playgroud)

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

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在我看来,声明"应该发生错误".在第三个FirstOrDefault()下 - 例子是误导性的. (4认同)

Meh*_*ari 19

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

介于First和之间时FirstOrDefault,您应该First在确定元素存在时使用,如果不存在,则会出现错误.

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

  • @Mehrdad - 好点,重新:首先返回IEnumerable,何时不使用FirstOrDefault. (2认同)

use*_*770 13

第一:

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

FirstOrDefault:

  • 返回序列的第一个元素,如果未找到任何元素,则返回默认值
  • 抛出异常:仅当源为null时
  • 在以下情况下使用:当预期超过1个元素且您只想要第一个元素时.也可以将结果清空

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


Kye*_*Kye 9

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

异常消息也不包括您可能使用过的任何Lambda表达式,这些表达式会使任何问题更难以调试.

这就是为什么我总是使用FirstOrDefault()即使我知道一个空条目将构成一个特殊的情况.

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


Nim*_*tri 7

第一的()

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

首先或默认()

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


She*_*ngh 6

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

  1. 第一/第一或默认
  2. 最后/最后或默认
  3. 单/单或默认

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

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

First() 运算符在满足条件后返回序列的第一个元素。如果没有找到元素,那么它将抛出异常。

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

FirstOrDefault() 运算符在满足条件后返回序列的第一个元素。如果没有找到元素,那么它将返回该类型的默认值。

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