我到处搜索,并没有真正找到一个明确的答案,什么时候你想使用. first,什么时候你想使用. firstordefault与LINQ。

什么时候你想用。first ?只有当你想捕捉异常,如果没有结果返回哪里? var result =列表。Where(x => x == "foo").First(); 什么时候使用。firstordefault ?当你总是想默认类型,如果没有结果? var result =列表。Where(x => x == "foo").FirstOrDefault(); 说到这,那塔克呢? var result =列表。Where(x => x == "foo").Take(1);


当前回答

第()

返回序列的第一个元素。 当结果中没有元素或源为空时抛出错误。 如果需要多个元素,而你只需要第一个元素,你应该使用它。

FirstOrDefault ()

返回序列的第一个元素,如果没有找到元素,则返回默认值。 仅当源为空时才抛出错误。 如果需要多个元素,而你只需要第一个元素,你应该使用它。 如果结果为空也很好。

我们有一个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的记录。返回值为空

希望它能帮助你理解何时使用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个期望的元素时,您应该只输入序列的第一个元素。

FirstOrDefault ()

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

.First will throw an exception when there are no results. .FirstOrDefault won't, it will simply return either null (reference types) or the default value of the value type. (e.g like 0 for an int.) The question here is not when you want the default type, but more: Are you willing to handle an exception or handle a default value? Since exceptions should be exceptional, FirstOrDefault is preferred when you're not sure if you're going to get results out of your query. When logically the data should be there, exception handling can be considered.

Skip()和Take()通常在设置结果分页时使用。(比如显示前10个结果,接下来的10个在下一页,等等)

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

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

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

代码:

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

我想看看其他人对此的评论。

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

在First和FirstOrDefault之间,当您确定一个元素存在,如果它不存在,那么就会出现错误时,应该使用First。

顺便说一下,如果你的序列包含默认(T)元素(例如null),你需要区分空元素和第一个元素为空,你不能使用FirstOrDefault。