我真的找到了一个明确的答案,你何时想要使用 .First
以及何时想要使用 .FirstOrDefault
和LINQ .
- 您想什么时候使用
.First
?只有当你想要在没有返回结果的情况下捕获异常时?
var result = List.Where(x => x == "foo").First();
- 你想什么时候使用
.FirstOrDefault
?如果没有结果,你总是想要默认类型?
var result = List.Where(x => x == "foo").FirstOrDefault();
- 就此而言,拿什么?
var result = List.Where(x => x == "foo").Take(1);
14 回答
如果没有要返回的行,则first()将抛出异常,而.FirstOrDefault()将返回默认值(所有引用类型为
NULL
) .因此,如果您已准备好并愿意处理可能的异常,
.First()
就可以了 . 如果你更喜欢检查!= null的返回值,那么.FirstOrDefault()
是你更好的选择 .但我想这也是个人偏好 . 使用对您更有意义的东西,更好地适应您的编码风格 .
好吧,让我给我两分钱 . First / Firstordefault适用于使用第二个构造函数的情况 . 我不会解释它是什么,但是当你可能总是使用一个因为你不想引起异常时 .
linq在集合上实现单个简单查询的方法很多,只需在sql中编写连接,根据需要和必要性,可以先应用或最后应用过滤器 .
这是一个示例,我们可以在集合中找到具有id的元素 . 要在此处添加更多内容,当集合至少有一条记录时,方法First,
FirstOrDefault
理想情况下会返回相同的值 . 但是,如果集合可以为空 . 然后First
将返回异常,但FirstOrDefault
将返回null
或默认值 . 例如,int
将返回0.因此,虽然这样做的使用是个人偏好,但最好使用FirstOrDefault
来避免异常处理 .First()
返回序列的第一个元素 .
当结果中没有元素或源为null时抛出错误 .
你应该使用它,如果预期有多个元素,你只想要第一个元素 .
FirstOrDefault()
返回序列的第一个元素,如果未找到任何元素,则返回默认值 .
仅在源为null时抛出错误 .
你应该使用它,如果预期有多个元素,你只想要第一个元素 . 如果结果是空的也很好 .
我们有一个UserInfos表,它有一些记录,如下所示 . 在下表的基础上,我创建了示例...
How to use First()
ID == 1只有一条记录 . 应该返回此记录
ID:1名字:Manish姓氏:Dubey电子邮件:xyz@xyz.com
有多个记录,其中FName == "Rahul" . 第一条记录应该是返回 .
ID:7名字:Rahul姓氏:Sharma电子邮件:xyz1@xyz.com
ID == 13没有记录 . 应该发生错误 .
InvalidOperationException:Sequence不包含任何元素
How to Use FirstOrDefault()
ID == 1只有一条记录 . 应该返回此记录
ID:1名字:Manish姓氏:Dubey电子邮件:xyz@xyz.com
有多个记录,其中FName == "Rahul" . 第一条记录应该是返回 .
ID:7名字:Rahul姓氏:Sharma电子邮件:xyz1@xyz.com
ID == 13没有记录 . 返回值为null
希望它能帮助您了解何时使用
First()
或FirstOrDefault()
.第一:
返回序列的第一个元素
抛出异常:结果中没有元素
在以下情况下使用:当预期超过1个元素且您只想要第一个元素时
FirstOrDefault:
返回序列的第一个元素,如果未找到任何元素,则返回默认值
抛出异常:仅当源为null时
在以下情况下使用:当预期超过1个元素且您只想要第一个元素时 . 也可以将结果清空
来自:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
需要注意的另一个区别是,如果您在 生产环境 环境中调试应用程序,则可能无法访问行号,因此识别方法中哪个特定的
.First()
语句引发异常可能很困难 .异常消息也不包括您可能使用过的任何Lambda表达式,这些表达式会使任何问题更难以调试 .
这就是为什么我总是使用
FirstOrDefault()
,即使我知道一个空条目将构成一个特例 .这种类型的函数属于元素运算符 . 下面定义了一些有用的元素运算符 .
First / FirstOrDefault
Last / LastOrDefault
Single / SingleOrDefault
当我们需要根据特定条件从序列中选择单个元素时,我们使用元素运算符 . 这是一个例子 .
First() operator returns the first element of a sequence after satisfied the condition. If no element is found then it will throw an exception.
int result = items.Where(item => item == 2).First();
FirstOrDefault() operator returns the first element of a sequence after satisfied the condition. If no element is found then it will return default value of that type.
int result1 = items.Where(item => item ==2).FirstOrDefault();
哪一个使用?它应该由业务逻辑决定,而不是对异常/程序失败的恐惧 .
例如,如果业务逻辑说我们在任何工作日都不能进行零交易(只是假设) . 那么你不应该尝试通过一些智能编程来处理这种情况 . 我总是会在这样的集合中使用First(),如果其他东西搞砸了业务逻辑,那么让程序失败 .
码:
我想看到其他人对此发表评论 .
我找到了一个网站,呼吁解释FirstOrDefault的需求
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
如果查询没有结果,并且您想要调用First()或Single()来获取单行...您将获得“Sequence contains no elements”异常 .
免责声明:我从未使用过LINQ,所以如果这是不合适的话我会道歉 .
.First
将在没有结果时抛出异常 ..FirstOrDefault
不会,它只返回null(引用类型)或值类型的默认值 . (例如对于int来说就像0
. )这里的问题不是你想要的默认类型,而是更多:你是否愿意处理异常或处理默认值?由于异常应该是例外情况,因此当您从查询中获取结果时,首选FirstOrDefault
. 当逻辑上数据应该存在时,可以考虑异常处理 .在结果中设置分页时通常使用
Skip()
和Take()
. (如显示前10个结果,下一页显示下10个,等等)希望这可以帮助 .
当我知道或期望序列至少有一个元素时,我会使用
First()
. 换句话说,当序列为空时出现异常情况 .当您知道需要检查是否存在元素时,请使用
FirstOrDefault()
. 换句话说,当序列为空时是合法的 . 您不应该依赖异常处理来进行检查 . (这是不好的做法,可能会伤害表现) .最后,
First()
和Take()
之间的区别在于First()
返回元素本身,而Take()
返回包含恰好一个元素的元素序列 . (如果传递1作为参数) .First()
当您知道结果包含多于1个元素时,您应该只是序列的第一个元素 .
FirstOrDefault()
FirstOrDefault()与First()类似,不同之处在于,如果没有元素匹配指定的条件,则返回默认值为泛型集合的基础类型 . 如果没有找到元素,它不会抛出InvalidOperationException . 但是元素或序列的集合是空的,而不是抛出异常 .
很抱歉发布旧帖子的答案 . 细节和良好的解释所以请阅读下面的网址http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
http://www.dotnet-tricks.com/Tutorial/linq/E23I160714-Understanding-Single,-SingleOrDefault,-First-and-FirstOrDefault.html
http://www.c-sharpcorner.com/UploadFile/3d39b4/singleordefault-and-firstordefault-methods-in-linq-to-sql/
首先,
Take
是一种完全不同的方法 . 它返回一个IEnumerable<T>
而不是一个T
,所以就这样了 .在
First
和FirstOrDefault
之间,你应该在're sure that an element exists and if it doesn'时使用First
,然后出现错误 .顺便说一下,如果您的序列包含
default(T)
个元素(例如null
),并且您需要区分为空且第一个元素为null
,则不能使用FirstOrDefault
.