Linq:在筛选条件下何时使用SingleOrDefault与FirstOrDefault()

考虑IEnenable扩展方法SingleOrDefault()FirstOrDefault()

MSDN文档SingleOrDefault:

返回序列的唯一元素,如果序列为空,则返回默认值;如果序列中有多个元素,此方法将抛出异常。

鉴于FirstOrDefault来自MSDN(大概是在使用OrderBy()OrderByDescending()或者根本没有),

返回序列的第一个元素。

考虑几个示例查询,何时使用这两种方法并不总是很清楚:

var someCust = db.Customers.SingleOrDefault(c=>c.ID == 5);
 //unlikely(?) to be more than one, but technically COULD BEvar 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?

问题

你遵循或建议什么惯例?在决定使用时SingleOrDefault()FirstOrDefault()在你的LINQ查询中?


子衿沉夜
浏览 899回答 3
3回答

哔哔one

无论何时你使用SingleOrDefault,您可以清楚地指出,查询最多应该导致单株结果。另一方面,当FirstOrDefault使用时,查询可以返回任意数量的结果,但您只需要第一个结果。我个人认为语义非常不同,使用适当的语义,取决于预期的结果,提高了可读性。

慕尼黑的夜晚无繁华

如果结果集返回0条记录:SingleOrDefault返回类型的默认值(例如,int的默认值为0)FirstOrDefault返回类型的默认值。如果结果集返回1条记录:SingleOrDefault返回记录FirstOrDefault返回记录如果结果集返回许多记录:SingleOrDefault抛出异常FirstOrDefault返回第一条记录结论:如果希望在结果集包含许多记录的情况下引发异常,请使用SingleOrDefault.如果无论结果集包含什么,始终需要1条记录,请使用FirstOrDefault

慕村225694

的确有语义差异性能差异在两者之间。语义差异:FirstOrDefault返回第一项的潜在多个(或默认情况下,不存在)。SingleOrDefault假设存在单个项并返回它(如果不存在则默认)。多项违反合同,引发异常。性能差异FirstOrDefault通常情况下,它的迭代速度更快,直到找到元素为止,并且只有在找不到元素时才需要迭代整个可枚举的元素。在许多情况下,很有可能找到一个项目。SingleOrDefault需要检查是否只有一个元素,因此始终迭代整个枚举。准确地说,它迭代直到找到第二个元素并抛出一个异常。但在大多数情况下,没有第二个因素。结语使用FirstOrDefault如果你不在乎有多少物品或当您无法负担检查唯一性时(例如,在一个非常大的集合中)。当您检查将项添加到集合时的唯一性时,在搜索这些项时再次检查可能太昂贵了。使用SingleOrDefault如果您不需要太在意性能,并且希望确保单个项目的假设对读者来说是明确的,并在运行时进行检查。在实践中,您可以使用First / FirstOrDefault通常情况下,当您假设一个项目,以提高性能。你还应该记得Single / SingleOrDefault可以提高可读性(因为它陈述了单个项目的假设)和稳定性(因为它检查了它)并适当地使用了它。
打开App,查看更多内容
随时随地看视频慕课网APP