2012-12-06 28 views
8

擴展方法ToList()如何工作?假設我有一個IEnumerable 10000個項目。將ToList()創建一個新的List並遍歷10000000項的IEnumerable,然後返回給我一個List或.NET是否以其他方式執行?IEnumerable上的ToList()如何工作?

這個MSDN link談論立即執行數據庫查詢。我的問題只是關於將IEnumerable轉換爲List

回答

22

它不一定重複,雖然這是「最壞的情況」的情況。基本上它叫new List<T>(source),但是它有一些小竅門:如果源實現ICollection<T>,構造函數可以調用ICollection<T>.CopyTo()將完整的數據複製到一個數組中。這可能比單步迭代更有效地實現。同樣在ICollection<T>的情況下,新列表知道開始的最終大小,所以它不需要繼續擴展它的內部緩衝區。請參閱我的Edulinq ToList() blog post

+0

上述鏈接不起作用。你可以在這裏導航到Jon的帖子 - [Edulinq ToList()blog post](https://codeblog.jonskeet.uk/2011/01/01/reimplementing-linq-to-objects-part-20-tolist/) – vibhu

+0

@ vibhu:更新了鏈接。 –

2

.ToList擴展方法調用List<T>構造函數將其傳遞給IEnumerable<T>。此構造函數將遍歷IEnumerable<T>並按照它們返回的相同順序複製IEnumerable<T>的elemtns。