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语句来阻止循环列表的其余部分是否有任何原因。无论如何,都会发生错误。对于一个一开始就发现多个项目的大列表,我认为这会有很大的不同。

Linq.的SingleOrDefault函数的优化

Jon Skeet在他的EduLinq博客系列中将LINQ重新实现到对象时发现了这一点

事实证明,在LINQ to Objects中,没有谓词的重载一看到第二个元素就会抛出InvalidOperationException,但有谓词的重载即使看到了与谓词匹配的第二个元件,也会不断迭代。这对我来说似乎是荒谬的前后矛盾——我已经打开了一个关于它的Connect问题;我们拭目以待。

在有问题的Connect问题中,Microsft表示:

这将是一个很好的清理,这样迭代整个序列使用接受谓词的Single重载时不需要-我们在找到第二个匹配时可能会很快失败,类似于在没有指定谓词时所做的操作。

然而,由于此处的性能优势仅限于Single的错误案例,此问题目前刚好低于我们的错误分流切割线。我们正在标记问题"不会修复"以表明我们目前没有跟踪以在的下一版本中解决此问题Visual Studio。如果我们得到通过我们的错误分类列表,或者如果我们重新访问以下版本的错误。

那是在2011年4月…