|
1
9
如果你真的想要最有效的克隆方法
|
|
|
2
2
编辑: 经过更仔细的检查,这似乎不是一个好主意,因为原始哈希集中少于60个元素,下面的方法看起来比创建新的哈希集慢。 免责声明: 这似乎有效,但如果要对克隆的哈希集进行序列化,您可能需要复制SerializationInfo m_siinfo,则风险由您自己承担。 我还遇到了这个问题并尝试了一下,下面您将发现一个扩展方法,它使用fieldinfo.getvalue和setvalue来复制所需的字段。它比使用散列集(IEnumerable)快,这在多大程度上取决于原始散列集中元素的数量。对于1000个元素,差异约为因子7。有100000个元素,大约是因子3。 还有其他的方法,可能会更快,但这已经摆脱了我目前的瓶颈。我试着使用ExpressionTrees和Emission,但遇到了障碍,如果我让他们工作,我会更新这篇文章。
|
|
|
3
0
简单的模式
Class cloneableDictionary(Of T, U)
Inherits Dictionary(Of T, U)
Function clone() As Dictionary(Of T, U)
Return CType(Me.MemberwiseClone, cloneableDict(Of T, U))
End Function
End Class
不幸的是,我不知道微软做了什么来阻止在不应该调用它的地方调用MemberWiseClone(例如,用MemberWiseClone的名称声明一个方法以外的东西,比如一个类),所以我不知道如何判断这种方法是否可行。 我认为标准集合不支持公共克隆方法,而只支持受保护的方法是有正当理由的:如果克隆,从集合派生的类可能会严重中断;如果基类的克隆方法是公共的,则无法阻止派生类的对象被赋予预期的代码。克隆它。 尽管如此,如果.NET包含可克隆的医学类和标准类型之类的类,那就太好了。( 虽然显然不是 基本上如上文所述实施)。 |
|
|
4
0
|
|
|
5
-1
从理论上讲,O(N)克隆尽可能好地克隆两个不会共享相同基础数据结构的集。 检查元素是否在哈希集中应该是一个常量时间(即o(1))操作。 因此,您可以创建一个包装器,它只包装一个现有的哈希集,并保留任何新的添加内容,但这似乎非常反常。 当你说“高效”时,你的意思是“比现有的O(N)方法更高效”——我假设,如果你不玩关于“克隆”含义的相当严肃的语义游戏,你就不能真正比O(N)更高效。 |
|
|
6
-3
只是一个偶然的想法。这可能是愚蠢的。 因为它们没有实现ICloneable,并且构造函数也没有使用源是同一类型的知识,所以我想我们只剩下一个选项了。实现优化版本并将其作为扩展方法添加到类型中。 类似:
然后,问题中的代码如下所示:
|
|
|
juiceb0xk · 运行安装程序时更改程序包名称。py公司 8 年前 |
|
|
vince · 角反应形式的深度复制? 8 年前 |
|
|
rener172846 · 如何在Haxe中克隆动态对象? 8 年前 |
|
|
Hemispherr · git克隆的权限被拒绝 8 年前 |
|
|
Jason · 克隆模板时如何更改内部div? 8 年前 |
|
|
yuppo · git属性中忽略了负面模式 8 年前 |