IEnumerable.Count()O(n)

bev*_*qua 5 c# linq ienumerable

我只是偶然发现了这段代码,我想知道为什么Count在循环中完成.

  /// <summary>
  /// find the first index in a sequence to satisfy a condition
  /// </summary>
  /// <typeparam name="T">type of elements in source</typeparam>
  /// <param name="source">sequence of items</param>
  /// <param name="predicate">condition of item to find</param>
  /// <returns>the first index found, or -1 if not found</returns>
  public static int FindIndex<T>(this IEnumerable<T> source, Predicate<T> predicate)
  {
         for (int i = 0; i < source.Count(); i++)
         {
               if (predicate(source.ElementAt(i))) return i;
         }
         return -1; // Not found
  }
Run Code Online (Sandbox Code Playgroud)

如果计数可以改变,我们不应该这样做:for(int i = source.Count() - 1; i> = 0; i--)

否则,我认为我们应该在循环开始之前计算计数,而不是每次都计算.

这样做的正确方法是什么?

Jon*_*Jon 14

为此编写手动代码的正确方法是丢失所有垃圾并简单地迭代foreach:

public static int FindIndex<T>(this IEnumerable<T> source, Predicate<T> predicate) 
{
    var index = 0;
    foreach(var item in source) {
        if(predicate(item)) {
            return index;
        }
        ++index;
    }

    return -1;
} 
Run Code Online (Sandbox Code Playgroud)