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。