2016-11-04 42 views
0

我有一個逗號分隔的字符串ctext,我想拆分並放入List<string>在這種情況下AddRange()比ToList()更快嗎?

將使用LINQ,

List<string> f = ctext.Split(',').ToList(); 

比不使用LINQ慢?

List<string> f; 
f.AddRange(ctext.Split(',')); 

看來,LINQ實際上在一些點的地方複製的東西這將使它更慢,而AddRange()只會檢查列表的大小後,展開它,並在它傾倒。

或者有沒有更快的方法? (就像使用for循環,但我對此表示懷疑。)

+1

爲什麼這些是唯一的選擇?怎麼樣'新列表(ctext.Split(','))'? –

+2

「ToList」和「AddRange」都是複製的。如果你想知道哪個更快,運行它們並測量。 –

+0

會做@DStanley。 – skwear

回答

6

幸運的是,我們可以很容易地看到ToList現在確實是開源的。 (請點擊鏈接查看最新消息...)

我以前沒見過IListProvider<T>,但我懷疑數組是否實現了它,這意味着我們基本上已經得到了new List<TSource>(source)。查看List<T>源代碼顯示構造函數和AddRange基本上都以CopyTo結束。

換句話說,除了幾個層面的間接性外,我希望他們都做同樣的事情。

+0

Github源代碼與referencesource.microsoft.com上列出的源代碼相同,或者在可靠性方面存在偏好。 –

+0

@Mrinal:我不知道。我對導航github更加熟悉。 –

+0

感謝您的信息 –

3

看來,LINQ實際上在一些點的地方複製的東西這將使它更慢,而的AddRange()將只檢查列表的大小一次,將其展開並將其轉儲。

你是正確的,這些事情都在發生,但不正確的想法是每個操作都是特定的。 ToListAddRange都做這兩件事情。兩種操作都將輸入序列中的所有值複製到列表中,並且由於它們都在同一時間添加多個項目,因此他們能夠一次性查看多少項來擴展列表的內部容量,而不是需要執行多個擴展。