为什么扩展方法的主要目的是Single()
?
我知道如果不是一个与序列中的谓词匹配的元素会抛出异常,但我仍然不明白它在哪个上下文中可能有用。
修改
我确实理解Single
正在做什么,所以你不需要在你的问题中解释这个方法的作用。
答案 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>
。要获得实际元素,您需要First
,Last
或Single
方法之一 - 如果您确定序列只包含一个元素,则使用后者。一个例子是数据库中的1:1 ID:Name映射。
答案 3 :(得分:0)
Single将返回类/对象的单个实例,而不是集合。当您通过Id获得单个记录时非常方便。我从不期待超过一行。