C# 为什么我们需要LINQ中的Single()?

C# 为什么我们需要LINQ中的Single()?,c#,.net,linq,extension-methods,ienumerable,C#,.net,Linq,Extension Methods,Ienumerable,为什么扩展方法的主要用途是Single() 我知道如果超过一个元素与序列中的谓词匹配,它将抛出异常,但是我仍然不知道它在哪个上下文中有用 编辑: 我确实理解Single在做什么,因此您不需要在问题中解释此方法的作用。每个LINQ运算符都返回一个序列,因此IEnumerable。要获得实际的元素,您需要使用First、Last或Single方法中的一种-如果您确定序列只包含一个元素,则可以使用后者。例如数据库中的1:1 ID:Name映射。这对于声明性声明非常有用 我想要列表中的单个元素,如果有多

为什么扩展方法
的主要用途是Single()

我知道如果超过一个元素与序列中的谓词匹配,它将抛出异常,但是我仍然不知道它在哪个上下文中有用

编辑:

我确实理解
Single
在做什么,因此您不需要在问题中解释此方法的作用。

每个LINQ运算符都返回一个序列,因此
IEnumerable
。要获得实际的元素,您需要使用
First
Last
Single
方法中的一种-如果您确定序列只包含一个元素,则可以使用后者。例如数据库中的1:1 ID:Name映射。

这对于声明性声明非常有用

我想要列表中的单个元素,如果有多个项目匹配,那么就出现了严重错误

很多时候,程序需要根据特定谓词将一组元素缩减为感兴趣的元素。如果有多个匹配项,则表示程序中存在错误。如果没有
Single
方法,程序将需要再次遍历潜在昂贵列表的部分

比较

Item i = someCollection.Single(thePredicate);

后者需要两条语句,并将一个可能代价高昂的列表迭代两次。不太好


注意:Yes
First
可能更快,因为它只需迭代枚举直到匹配的第一个元素。其余的要素都无关紧要。另一方面,<代码>单<代码>必须考虑整个枚举。如果多个匹配对您的程序没有影响,并且指示没有编程错误,则选择是,首先使用

使用
Single
可以记录您对结果数量的期望,如果结果错误,可以尽早失败,也可以努力失败。除非您喜欢长时间的调试会话,否则我认为这对于提高代码的健壮性非常有用。

单个将返回类/对象的单个实例,而不是集合。当你通过Id获得一条记录时非常方便。我从来没有期望超过一行。

我知道,但是在数据库中的
1:1
Id:Name
关系中,我们可以使用
First()
,它会更快。我想第二行和single在幕后的工作类似?它必须对整个集合进行评估,这就是它如何知道对超过1个匹配项抛出异常的方法,但它可以节省您每次编写代码的时间。我认为Single比First慢就是因为这个原因?@RichardW1001我的第二个代码片段和实际的
Single
实现之间的区别是枚举的次数。在
Single
实现中,最坏情况是1次,而在我的代码片段中,最坏情况是2次。第一个可能更快,因为它可以在看到匹配元素时停止枚举。因此,如果它是第一个元素,那么枚举很快。如果匹配元素是最后一个元素,则
First
Single
的性能几乎相同identical@JaredPar很好的解释。我可以在LINQ to对象中看到它的使用,但在LINQ to SQL/实体中看不到,因为它通常用于具有唯一字段(例如,
Id
)的表中,你永远不会有两个Id相同的值,因为它们是主键,你不可能两次插入相同的Id。@Oscar我对LINQ to SQL的细节不太熟悉,所以我很难确定地评论。我的直觉是,您的断言是正确的。对于LINQ2SQL,同样的推理也适用。如果您检查生成的sql,您将看到它实际上在那里生成SELECTTOP2,以便在返回多个元素时能够抛出。
Contract.Requires(someCollection.Where(thePredicate).Count() == 1);
Item i = someCollection.First(thePredicate);