我到处搜索,还没有真正找到关于何时使用.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);
#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
,所以就可以了。
在First
和FirstOrDefault
,如果您确定某个元素存在,则应该使用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楼
第一()
- 返回序列的第一个元素。
- 当结果中没有元素或源为null时,它将引发错误。
- 如果需要多个元素,并且只需要第一个元素,则应使用它。
FirstOrDefault()
- 返回序列的第一个元素,如果找不到元素,则返回默认值。
- 仅当源为null时,它才会引发错误。
- 如果需要多个元素,并且只需要第一个元素,则应使用它。 如果结果为空也很好。
我们有一个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楼
此类型的函数属于元素运算符。 下面定义了一些有用的元素运算符。
- First / FirstOrDefault
- 最后/最后或默认
- 单/单或默认
当我们需要根据特定条件从序列中选择单个元素时,可以使用元素运算符。 这是一个例子。
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
以避免异常处理。
#13楼
好吧,让我给我两美分。 First / Firstordefault用于使用第二个构造函数的情况。 我不会解释它是什么,但是这是因为您不想引起异常而可能总是使用一个。
person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
return string.IsNullOrEmpty(p.Relationship);
}));