使用Any扩展方法比使用旧的for循环方式有任何性能提升吗?
答案 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>
的所有元素时,没有性能增益。但是,在这个方向上的任何“优化”都会落在过早优化之下,如果存在性能问题,则在您的算法中比在此函数中更有可能修复它。