簡體   English   中英

Enumerable.ToList()是否有懲罰

[英]Is there a penalty for Enumerable.ToList()

Enumerable不允許我們通過索引訪問元素,如anEnumerable[i] 但列表確實 - aList[i] 因此,與Enumerable相比,List提供了額外的功能。

當我們執行.ToList()將枚舉轉換為列表時,操作是在恆定時間內完成還是需要遍歷枚舉才能將其轉換為列表?

時間必須至少為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調用Add,這是您的成本。

我應該指出,在更一般的情況下可能會有代碼來執行類似的操作

if (e is IList<T>) return (IList<T>)e;

看看ElementAt它允許你傳入一個索引來查找,並將評估可枚舉到那一點。

ToList()通過IEnumerable枚舉一次並將項目​​復制到List對象中,因此復雜度為O(n)。

它至少是一個O(n)操作。 ToList()強制IEnumerable枚舉意味着您迭代集合一次。 它很可能在此之前分配了一個新列表,然后在foreach添加每個項目a。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM