Enumerable.ToList()是否有惩罚?



Enumerable不能像anEnumerable[i]那样通过索引访问元素。但是一个列表可以——aList[i]。因此,与Enumerable相比,List提供了一个额外的特性。

当执行.ToList()将可枚举对象转换为列表时,该操作是在常量时间内完成,还是需要遍历该可枚举对象才能将其转换为列表?

时间必须至少为0 (n),因为代码将做这样的事情:

public static IList<T> ToList(this IEnumerable<T> e)
{
    List<T> list = new List<T>();
    foreach (T elem in e) list.Add(elem);
    return list;
}

由于您有list.Count呼叫添加,这是您的成本。

我应该指出,在更一般的情况下,可能有一些代码可以做像 这样的事情
if (e is IList<T>) return (IList<T>)e;

看一下ElementAt,它允许您传递要查找的索引,并将计算到该点的可枚举对象

ToList()通过IEnumerable枚举一次,并将这些项复制到List对象中,因此复杂度为O(n)。

这至少是一个0 (n)的操作。ToList()强制枚举IEnumerable,这意味着对集合进行一次迭代。它很可能在分配一个新列表之前,然后在foreach中添加每个项a。

相关内容

  • 没有找到相关文章

最新更新