Enumerable不允许我们按照anEnumerable[i]
之类的索引访问元素。但列表确实 - aList[i]
。因此,与Enumerable相比,List提供了额外的功能。
当我们执行.ToList()将枚举转换为列表时,操作是在恒定时间内完成的,还是需要遍历枚举才能将其转换为列表?
答案 0 :(得分:7)
时间必须至少为O(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;
答案 1 :(得分:3)
看一下ElementAt它允许你传入一个索引来查找,并将评估可枚举到那一点。
答案 2 :(得分:1)
ToList()
通过IEnumerable枚举一次并将项目复制到List
对象中,因此复杂度为O(n)。
答案 3 :(得分:1)
至少是O(n)操作。 ToList()
强制IEnumerable
的枚举意味着您迭代集合一次。它很可能在此之前分配了一个新列表,然后在foreach
中添加每个项目。