【发布时间】:2011-05-14 20:54:52
【问题描述】:
为什么扩展方法Single()的主要用途是?
我知道如果多个元素与序列中的谓词匹配,它会抛出异常,但是我仍然不明白它在哪种上下文中可能有用。
编辑:
我确实了解 Single 在做什么,因此您无需在问题中解释此方法的作用。
【问题讨论】:
标签: c# .net linq extension-methods ienumerable
为什么扩展方法Single()的主要用途是?
我知道如果多个元素与序列中的谓词匹配,它会抛出异常,但是我仍然不明白它在哪种上下文中可能有用。
编辑:
我确实了解 Single 在做什么,因此您无需在问题中解释此方法的作用。
【问题讨论】:
标签: c# .net linq extension-methods ienumerable
这对于声明性陈述很有用
我想要列表中的单个元素,如果有多个匹配项,那么就大错特错了
很多时候,程序需要根据特定谓词将一组元素简化为有趣的元素。如果有多个匹配,则表明程序中存在错误。如果没有 Single 方法,程序将需要再次遍历可能昂贵列表的部分。
比较
Item i = someCollection.Single(thePredicate);
到
Contract.Requires(someCollection.Where(thePredicate).Count() == 1);
Item i = someCollection.First(thePredicate);
后者需要两个语句,并迭代一个可能很昂贵的列表两次。不好。
注意:是的First可能更快,因为它只需要迭代枚举直到第一个匹配的元素。其余元素无关紧要。另一方面Single 必须考虑整个枚举。如果多个匹配项对您的程序没有影响并且表明没有编程错误,那么可以使用First。
【讨论】:
Single 实现之间的区别在于枚举被枚举的次数。在Single 实现中,最坏的情况是1 次,而在我的代码sn-p 中,最坏的情况是2 次。首先是可能更快,因为它可以在看到匹配元素的那一刻停止枚举。所以如果它是第一个元素,那么枚举很快。如果匹配元素是最后一个元素,那么First 和Single 的性能几乎相同
Id),并且您永远不会有两个值相同的Id,因为它们是主键,您不能插入相同的Id 两次。
使用Single 可让您记录您对结果数量的期望,并尽早失败,如果错误则坚决失败。除非您为了自己的利益而享受长时间的调试会话,否则我会说这对于提高代码的健壮性非常有用。
【讨论】:
每个 LINQ 运算符都返回一个序列,因此是 IEnumerable<T>。要获得实际元素,您需要First、Last 或Single 方法之一——如果您确定序列只包含一个元素,则使用后者。一个示例是数据库中的 1:1 ID:Name 映射。
【讨论】:
1:1 ID:Name 关系中,我们可以使用First(),它会更快。
Single 将返回类/对象的单个实例,而不是集合。当您通过 Id 获得单个记录时非常方便。我从没想过会超过一排。
【讨论】: