在List上使用Any等时获得的任何性能提升

时间:2010-12-29 04:36:14

标签: c# .net

使用Any扩展方法比使用旧的for循环方式有任何性能提升吗?

2 个答案:

答案 0 :(得分:4)

简而言之,不;性能可能略微更差。

在实践中,这种方法的简洁性和清晰度将在循环中具有维护优势,并且不易出现错误。

这样想:如果你写了50个循环并忘记在其中一个中进行短路评估,你最好在所有50个循环中使用.Any

答案 1 :(得分:0)

对于索引集合,您可以执行以下操作:

for(int i = 0; i < col.Length;i++)
{
  if (predicate(col[i]))
    return true;
}
return false;

但对于非索引IEnumerable<T>,这是不可能的,因为它不提供索引器。这将是框架中的实现(通过反思):

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    if (predicate == null)
    {
        throw Error.ArgumentNull("predicate");
    }
    foreach (TSource local in source)
    {
        if (predicate.Invoke(local))
        {
            return true;
        }
    }
    return false;
}

当它迭代IEnumerable<T>的所有元素时,没有性能增益。但是,在这个方向上的任何“优化”都会落在过早优化之下,如果存在性能问题,则在您的算法中比在此函数中更有可能修复它。