何时使用。首先以及何时使用。使用LINQ的FirstOrDefault?

我搜索了一下,还没有找到一个明确的答案,什么时候你想使用.First,什么时候你想在LINQ中使用.FirstOrDefault

  • 什么时候你想使用.First?只有当你想在没有返回结果的情况下捕获异常时?

    var result = List.Where(x => x == "foo").First();
  • And when would you want to use .FirstOrDefault? When you'd always want the default type if no result?

    var result = List.Where(x => x == "foo").FirstOrDefault();
  • And for that matter, what about Take?

    var result = List.Where(x => x == "foo").Take(1);
680194 次浏览

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

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

但我想这也有点个人偏好。使用对你更有意义并且更适合你的编码风格的东西。

当我知道或期望序列至少有一个元素时,我会使用First()。换句话说,当序列为空是一种例外情况时。

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

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

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

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

希望这有帮助。

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

FirstFirstOrDefault之间,当您确定元素存在时应该使用First,如果不存在,则会出现错误。

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

我找到了一个网站来解释FirstOrDefault的必要性
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
如果查询没有结果,并且您想调用First()或Sing()来获取单行……您将获得“序列不包含元素”异常。

免责声明:我从来没有使用过LINQ,所以如果这是离题的话,我很抱歉。

someList.First(); // exception if collection is empty.someList.FirstOrDefault(); // first item or default(Type)

用哪个?它应该由业务逻辑决定,而不是担心异常/程序失败。

例如,如果业务逻辑说我们在任何工作日都不能有零交易(只是假设)。那么您不应该尝试使用一些智能编程来处理这种情况。我将始终使用First()而不是这样的集合,如果其他东西搞砸了业务逻辑,则让程序失败。

代码:

var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()

我希望看到其他人对此发表评论。

好吧,让我给我的两分钱。当您使用第二个构造函数时。我不会解释它是什么,但它是您可能总是使用一个的时候,因为您不想导致异常。

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>{return string.IsNullOrEmpty(p.Relationship);}));

第一:

  • 返回序列的第一个元素
  • 抛出异常:结果中没有元素
  • 使用时:当期望超过1个元素并且您只想要第一个元素时

默认初始化:

  • 返回序列的第一个元素,如果没有找到元素,则返回默认值
  • 抛出异常:仅当源为空时
  • 使用时:当期望超过1个元素并且您只想要第一个元素时。结果为空也可以

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

第一()

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

FirstOrDefault()//初始化错误码

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

我们有一个UserInfos表,其中有一些记录如下所示。在下面这个表的基础上,我创建了示例…

用户信息表

如何使用First()

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

只有一条ID==1的记录。应该返回这条记录
身份证:1名:Manish姓氏:Dubey电子邮件:xyz@xyz.com

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

FName=="Rahul"有多条记录。应该返回第一条记录。
身份证:7名姓名:Rahul姓氏:Sharma电子邮件:xyz1@xyz.com

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

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

如何使用FirstOrDefault()

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

只有一条ID==1的记录。应该返回这条记录
身份证:1名:Manish姓氏:Dubey电子邮件:xyz@xyz.com

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

FName=="Rahul"有多条记录。应该返回第一条记录。
身份证:7名姓名:Rahul姓氏:Sharma电子邮件:xyz1@xyz.com

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

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

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

另一个需要注意的区别是,如果您在生产环境中调试应用程序,您可能无法访问行号,因此识别方法中的哪个特定.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));}

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

  1. 默认初始化/初始化
  2. LastOrDefault/LastOrDefault/最后一次默认值
  3. 单个/单个或默认

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

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

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

int结果=项目。其中(项目=>项目==2)。First();

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

intOrDefault();//结果1=项目,如果(项目=>项目==2)。

第一()

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

FirstOrDefault()//初始化错误码

FirstOrDefault()和First()一样,不同的是,如果没有元素匹配指定的条件,它会返回泛型集合底层类型的默认值。如果没有找到元素,它不会抛出InvalidOP ationException。但是元素或序列的集合为空,而不是抛出异常。

linq有很多方法可以实现对集合的单个简单查询,只需我们在sql中编写连接,就可以根据需要和必要性首先或最后应用过滤器。

这是一个示例,我们可以在其中找到一个集合中具有id的元素。为了增加更多,当集合至少有一条记录时,方法First,FirstOrDefault,理想情况下会返回相同的值。但是,如果集合是空的,那么First将返回一个异常,但FirstOrDefault将返回null或默认值。例如,int将返回0。因此,尽管说这样的用法是个人偏好,但最好使用FirstOrDefault来避免异常处理。这是一个例子,我们运行事务列表的集合

其他人很好地描述了First()FirstOrDefault()之间的区别。我想进一步解释这些方法的语义学。在我看来,FirstOrDefault被过度使用了。在大多数情况下,当你过滤数据时,你要么期望得到与逻辑条件匹配的元素集合,要么期望得到一个唯一标识符的唯一元素,例如用户、书、帖子等……这就是为什么我们甚至可以说FirstOrDefault()是一种代码味道,不是因为它有问题,而是因为它被使用得太频繁了。这篇博客文章详细探讨了这个主题。大多数时候,IMOSingleOrDefault()是一个更好的选择,所以要注意这个错误,并确保你使用最合适的方法来清楚地代表你的合同和期望。