如何在C#或Java中创建任意对象的副本?

时间:2014-06-13 14:29:36

标签: java c# reference

假设我需要创建一个多集数据结构,其中包含两个集合的交集和并集。使用c#或java。

在这两种情况下,我都需要创建两个集合中每个对象的副本,否则更改其中一个集合可能会破坏其他集合。

我看到一个解决方案:指定泛型类型,例如

class MultiSet<T, U> where T : struct, where U : ICloneable

或类似的东西在java。

还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

  

在这两种情况下,我都需要创建两个集合中每个对象的副本,否则更改其中一个集合可能会破坏其他集合

如果你想要两个对象集合的交叉,你需要引用那些&#34;匹配&#34;结果,而不是他们的副本。后者毫无意义。

要检查两个对象是否相同(在第1组和第2组中),只需以有意义的方式比较它们(即覆盖它们的哈希码和比较方法)。

结果集合的结构也将取决于对象是否相等而没有它们的引用相等。在这种情况下,生成的集合需要保存两个引用(每个引用两个&#34;匹配&#34;),每个引用一个。

至于union,只需创建一个集合,该集合包含对两个集合中所有对象的引用。

完整的附注

Union和intersect是数据操作,所以我假设你的集合将保存数据。在编程语言中进行此类操作并不是最好的主意。还有其他工具可以完成任务,例如SQL。

答案 1 :(得分:1)

除推荐的ICloneable外? (我说推荐的方式,但克隆通常被认为是坏的)

我想如果对象是Serializable,你可以序列化和反序列化为一个新对象。

    var formatter = new BinaryFormatter();
    var stream = new MemoryStream();
    using (stream)
    {
        formatter.Serialize(stream, yourObject);
        stream.Seek(0, SeekOrigin.Begin);
        return (YourObjectType)formatter.Deserialize(stream);
    }

添加一个空检查,它将为可序列化对象提供一个很好的扩展方法。

再一次,克隆可能不是解决您问题的好方法,但我对您的用例的了解不足以推荐任何内容。