LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria(LINQ:何时使用 SingleOrDefault 与 FirstOrDefault() 与过滤条件)
问题描述
考虑 IEnumerable 扩展方法 SingleOrDefault() 和 FirstOrDefault()
Consider the IEnumerable extension methods SingleOrDefault() and FirstOrDefault()
MSDN 文档 SingleOrDefault:
返回序列的唯一元素,如果序列为空,则返回默认值;如果序列中有多个元素,此方法将引发异常.
Returns the only element of a sequence, or a default value if the sequence is empty; this method throws an exception if there is more than one element in the sequence.
而 FirstOrDefault 来自 MSDN (大概在使用 OrderBy() 或 OrderByDescending() 或根本不使用时),
whereas FirstOrDefault from MSDN (presumably when using an OrderBy() or OrderByDescending() or none at all),
返回序列的第一个元素
考虑一些示例查询,并不总是很清楚何时使用这两种方法:
Consider a handful of example queries, it's not always clear when to use these two methods:
var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE
var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?
var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?
问题
在决定在 LINQ 查询中使用 SingleOrDefault() 和 FirstOrDefault() 时,您遵循或建议哪些约定?
What conventions do you follow or suggest when deciding to use SingleOrDefault() and FirstOrDefault() in your LINQ queries?
推荐答案
每当你使用 SingleOrDefault,您清楚地声明该查询最多应该产生一个 single 结果.另一方面,当 FirstOrDefault 使用,查询可以返回任意数量的结果,但你声明你只想要第一个.
Whenever you use SingleOrDefault, you clearly state that the query should result in at most a single result. On the other hand, when FirstOrDefault is used, the query can return any amount of results but you state that you only want the first one.
我个人发现语义非常不同,根据预期结果使用适当的语义可以提高可读性.
I personally find the semantics very different and using the appropriate one, depending on the expected results, improves readability.
这篇关于LINQ:何时使用 SingleOrDefault 与 FirstOrDefault() 与过滤条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:LINQ:何时使用 SingleOrDefault 与 FirstOrDefault() 与过滤条件
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 输入按键事件处理程序 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- 如何用自己压缩一个 IEnumerable 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
