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

本文关键字:Single 我们 LINQ 为什么 | 更新日期: 2023-09-27 17:56:22

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

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

编辑:
我确实了解Single在做什么,所以你不需要在你的问题中解释这种方法的作用。

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

它对于以声明方式声明很有用

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

出现问题

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

比较

Item i = someCollection.Single(thePredicate);

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

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

注意:是的,First可能更快,因为它只需要迭代枚举,直到匹配的第一个元素。 其余元素无关紧要。 另一方面,Single必须考虑整个枚举。 如果多个匹配项对您的程序无关紧要并且指示没有编程错误,那么是的,请使用 First

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

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

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