Dot-Net
在 LINQ 查詢中呼叫 ToList() 或 ToArray() 更好嗎?
我經常遇到我想在聲明它的地方評估查詢的情況。這通常是因為我需要多次迭代它並且計算成本很高。例如:
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顯然更好。這裡的關鍵是分析,分析,然後再分析一些。