为什么我们在LINQ中需要Single()?

时间:2011-05-14 20:54:52

标签: c# .net linq extension-methods ienumerable

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

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

修改
我确实理解Single正在做什么,所以你不需要在你的问题中解释这个方法的作用。

4 个答案:

答案 0 :(得分:15)

它以声明性陈述

有用
  

我想要列表中的单个元素,如果多个项目匹配,则表示非常错误

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

比较

Item i = someCollection.Single(thePredicate);

Contract.Requires(someCollection.Where(thePredicate).Count() == 1);
Item i = someCollection.First(thePredicate);

后者需要两个语句并且两次迭代一个可能很昂贵的列表。不好。

注意:是First 可能更快,因为它只需要迭代枚举直到第一个匹配的元素。其余的元素并不重要。另一方面,Single必须考虑整个枚举。如果多个匹配对您的程序没有影响并且表明没有编程错误,则使用First

答案 1 :(得分:3)

使用Single可以记录您对结果数量的期望,并提前失败,如果错误就会失败。除非您为了自己的利益而享受长时间的调试,否则我认为它对于提高代码的健壮性非常有用。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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