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

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

  • 您什么时候要使用.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); 

#1楼

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

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

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


#2楼

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

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

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


#3楼

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

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

希望这可以帮助。


#4楼

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

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

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


#5楼

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

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


#6楼

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

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

例如,如果业务逻辑说我们在任何工作日都不能有零笔交易(假设)。 然后,您不应尝试通过一些智能编程来处理这种情况。 我将始终在此类集合上使用First(),并且如果其他事情弄糟了业务逻辑,则会让程序失败。

码:

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

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


#7楼

第一:

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

FirstOrDefault:

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

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


#8楼

第一()

  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()


#9楼

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

#10楼

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

  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();


#11楼

第一()

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

FirstOrDefault()

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


#12楼

linq有很多方法可以对集合实施单个简单查询,仅我们在sql中编写联接,便可以根据需要或必要性首先应用过滤器。

这是一个示例,其中我们可以在集合中找到具有id的元素。 要添加更多FirstOrDefault ,理想情况下,当集合具有至少一条记录时,方法First, FirstOrDefault会返回相同的结果。 但是,如果集合可以为空。 然后First将返回异常,但FirstOrDefault将返回null或default。 例如, int将返回0。因此,尽管说使用此类是个人喜好,但最好使用FirstOrDefault以避免异常处理。 这是一个示例,其中我们遍历了transactionlist的集合


#13楼

好吧,让我给我两美分。 First / Firstordefault用于使用第二个构造函数的情况。 我不会解释它是什么,但是这是因为您不想引起异常而可能总是使用一个。

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值