gpt4 book ai didi

.net - 克隆 HashSet 的有效方法?

转载 作者:行者123 更新时间:2023-12-02 11:03:30 25 4
gpt4 key购买 nike

前几天回复an interesting question关于 SO 关于 HashSet<T> .一个可能的解决方案涉及克隆哈希集,在我的回答中,我建议做这样的事情:

HashSet<int> original = ...
HashSet<int> clone = new HashSet<int>(original);

虽然这种方法很简单,但我怀疑它的效率很低:新的 HashSet<T> 的构造函数需要从原始哈希集中单独添加每个项目, 检查它是否已经存在 .这显然是在浪费时间:因为源集合是 ISet<T> ,保证不包含重复项。应该有一种方法可以利用这些知识......

理想情况下, HashSet<T>应该执行 ICloneable ,但不幸的是事实并非如此。我还用 Reflector 检查了 HashSet<T>如果源集合是一个哈希集,构造函数做了一些特定的事情,但事实并非如此。它可能可以通过在私有(private)字段上使用反射来完成,但这将是一个丑陋的黑客......

那么,是否有人想出了一个聪明的解决方案来更有效地克隆哈希集?

(请注意,这个问题纯属理论,我不需要在实际程序中这样做)

最佳答案

如果您真的想要最有效的方法来克隆 HashSet<T> ,您将执行以下操作(但可能以可维护性为代价)

  • 使用反射器或调试器来确定 HashSet<T> 中的确切字段需要复制。您可能需要对每个字段递归地执行此操作。
  • 使用Reflection.Emit或使用表达式树生成一个方法,该方法对所有字段进行必要的复制。可能需要调用其他生成的方法来复制每个字段的值。我们使用运行时代码生成,因为它是直接访问私有(private)字段的唯一方法。
  • 使用FormatterServices.GetUninitializedObject(...)实例化一个空白对象。使用步骤 2 中生成的方法将原始对象复制到新的空白对象中。
  • 关于.net - 克隆 HashSet<T> 的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927789/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com