Dot-Net

複製 HashSet<T> 的有效方法?

  • October 13, 2010

幾天前,我在 SO 上回答了一個關於HashSet&lt;T&gt;. 一個可能的解決方案涉及複製雜湊集,在我的回答中,我建議做這樣的事情:

HashSet&lt;int&gt; original = ...
HashSet&lt;int&gt; clone = new HashSet&lt;int&gt;(original);

雖然這種方法非常簡單,但我懷疑它的效率很低:new 的建構子HashSet&lt;T&gt;需要單獨添加原始雜湊集中的每個項目,並檢查它是否已經存在。這顯然是在浪費時間:因為源集合是 a ISet&lt;T&gt;,所以保證不包含重複項。應該有一種方法可以利用這些知識……

理想情況下,HashSet&lt;T&gt;應該實施ICloneable,但不幸的是,事實並非如此。我還檢查了 Reflector,HashSet&lt;T&gt;如果源集合是一個雜湊集,建構子是否做了一些特定的事情,但事實並非如此。它可能可以通過在私有欄位上使用反射來完成,但這將是一個醜陋的黑客……

那麼,是否有人想出了一個聰明的解決方案來更有效地複製雜湊集?

(請注意,這個問題純屬理論,我不需要在實際程序中這樣做)

如果您真的想要最有效的複製 a 的方法HashSet&lt;T&gt;,您可以執行以下操作(但可能以可維護性為代價)

  1. HashSet&lt;T&gt;使用反射器或調試器來確定需要複製哪些欄位。您可能需要對每個欄位遞歸地執行此操作。
  2. 使用Reflection.Emit或使用表達式樹來生成對所有欄位進行必要複製的方法。可能需要呼叫其他生成的方法來複製每個欄位的值。我們使用執行時程式碼生成,因為它是直接訪問私有欄位的唯一方法。
  3. 用於FormatterServices.GetUninitializedObject(...)實例化一個空白對象。使用步驟 2 中生成的方法將原始對象複製到新的空白對像中。

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