Enumerable.ToList()是否有惩罚

时间:2014-03-10 19:29:48

标签: c# linq

Enumerable不允许我们按照anEnumerable[i]之类的索引访问元素。但列表确实 - aList[i]。因此,与Enumerable相比,List提供了额外的功能。

当我们执行.ToList()将枚举转换为列表时,操作是在恒定时间内完成的,还是需要遍历枚举才能将其转换为列表?

4 个答案:

答案 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中添加每个项目。