[英]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.