Dot-Net
複製 HashSet<T> 的有效方法?
幾天前,我在 SO 上回答了一個關於
HashSet<T>. 一個可能的解決方案涉及複製雜湊集,在我的回答中,我建議做這樣的事情:HashSet<int> original = ... HashSet<int> clone = new HashSet<int>(original);雖然這種方法非常簡單,但我懷疑它的效率很低:new 的建構子
HashSet<T>需要單獨添加原始雜湊集中的每個項目,並檢查它是否已經存在。這顯然是在浪費時間:因為源集合是 aISet<T>,所以保證不包含重複項。應該有一種方法可以利用這些知識……理想情況下,
HashSet<T>應該實施ICloneable,但不幸的是,事實並非如此。我還檢查了 Reflector,HashSet<T>如果源集合是一個雜湊集,建構子是否做了一些特定的事情,但事實並非如此。它可能可以通過在私有欄位上使用反射來完成,但這將是一個醜陋的黑客……那麼,是否有人想出了一個聰明的解決方案來更有效地複製雜湊集?
(請注意,這個問題純屬理論,我不需要在實際程序中這樣做)
如果您真的想要最有效的複製 a 的方法
HashSet<T>,您可以執行以下操作(但可能以可維護性為代價)
HashSet<T>使用反射器或調試器來確定需要複製哪些欄位。您可能需要對每個欄位遞歸地執行此操作。- 使用
Reflection.Emit或使用表達式樹來生成對所有欄位進行必要複製的方法。可能需要呼叫其他生成的方法來複製每個欄位的值。我們使用執行時程式碼生成,因為它是直接訪問私有欄位的唯一方法。- 用於
FormatterServices.GetUninitializedObject(...)實例化一個空白對象。使用步驟 2 中生成的方法將原始對象複製到新的空白對像中。