Dot-Net

在 LINQ 查詢中呼叫 ToList() 或 ToArray() 更好嗎?

  • July 9, 2009

我經常遇到我想在聲明它的地方評估查詢的情況。這通常是因為我需要多次迭代它並且計算成本很高。例如:

string raw = "...";
var lines = (from l in raw.Split('\n')
            let ll = l.Trim()
            where !string.IsNullOrEmpty(ll)
            select ll).ToList();

這工作正常。如果我不打算修改結果,那麼我不妨呼叫ToArray()而不是ToList().

但是我想知道是否ToArray()是通過第一次呼叫實現的ToList(),因此記憶體效率低於呼叫ToList().

我瘋了嗎?我應該打電話ToArray()嗎 - 知道記憶體不會被分配兩次是安全的嗎?

除非您只需要一個數組來滿足您應該使用的其他約束ToList。在大多數情況下ToArray會分配比ToList.

兩者都使用數組進行儲存,但ToList具有更靈活的約束。它需要數組至少與集合中元素的數量一樣大。如果數組更大,那不是問題。但是ToArray,需要將數組的大小精確到元素的數量。

為了滿足這個約束ToArray,通常比ToList. 一旦它有一個足夠大的數組,它就會分配一個大小完全正確的數組並將元素複製回該數組。唯一可以避免這種情況的情況是,當數組的增長算法恰好與需​​要儲存的元素數量一致時(絕對是少數)。

編輯

有幾個人問我在List<T>值中有多餘的未使用記憶體的後果。

這是一個合理的擔憂。如果創建的集合是長期存在的,在創建後從不修改,並且很有可能登陸 Gen2 堆,那麼您最好預先分配額外的分配ToArray

總的來說,儘管我發現這種情況很少見。更常見的是看到很多ToArray呼叫立即傳遞給其他短暫的記憶體使用,在這種情況下ToList顯然更好。

這裡的關鍵是分析,分析,然後再分析一些。

引用自:https://stackoverflow.com/questions/1105990