Linq.的SingleOrDefault函数的优化
本文关键字:优化 函数 SingleOrDefault Linq | 更新日期: 2023-09-27 18:00:10
以下是从SingleOrDefault函数提取的代码:
public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if (source == null) throw Error.ArgumentNull("source");
if (predicate == null) throw Error.ArgumentNull("predicate");
TSource result = default(TSource);
long count = 0;
foreach (TSource element in source) {
if (predicate(element)) {
result = element;
checked { count++; }
}
}
switch (count) {
case 0: return default(TSource);
case 1: return result;
}
throw Error.MoreThanOneMatch();
}
我想知道在循环中找到多个元素后,没有break语句来阻止循环列表的其余部分是否有任何原因。无论如何,都会发生错误。对于一个一开始就发现多个项目的大列表,我认为这会有很大的不同。
Jon Skeet在他的EduLinq博客系列中将LINQ重新实现到对象时发现了这一点
事实证明,在LINQ to Objects中,没有谓词的重载一看到第二个元素就会抛出InvalidOperationException,但有谓词的重载即使看到了与谓词匹配的第二个元件,也会不断迭代。这对我来说似乎是荒谬的前后矛盾——我已经打开了一个关于它的Connect问题;我们拭目以待。
在有问题的Connect问题中,Microsft表示:
这将是一个很好的清理,这样迭代整个序列使用接受谓词的
Single
重载时不需要-我们在找到第二个匹配时可能会很快失败,类似于在没有指定谓词时所做的操作。然而,由于此处的性能优势仅限于
Single
的错误案例,此问题目前刚好低于我们的错误分流切割线。我们正在标记问题"不会修复"以表明我们目前没有跟踪以在的下一版本中解决此问题Visual Studio。如果我们得到通过我们的错误分类列表,或者如果我们重新访问以下版本的错误。
那是在2011年4月…