2009-01-05 67 views
1

任何人都知道是否有一種簡單或已知的方法來編寫一種可以在任何類型的數組上工作的深度複製方法,即鋸齒狀,多維等?我打算把它寫成擴展方法。DeepCopy陣列

框架中沒有默認的方法來做到這一點,對吧?我很驚訝沒有找到一個。

我已經看到了一些基於序列化的實現,它們很慢,所以我想要一個不使用任何類型序列化的解決方案。

回答

5

這個問題目前的狀態有點不清楚;它是可能 a duplicate(在刪除的答覆中指出),但評論表明這不太合適。

重新序列化放慢速度 - 不幸的是,在.NET中沒有正確支持「深度克隆」功能。有ICloneable,但那是一個:很少使用,和b:沒有說淺或深。同樣,可靠的深度克隆數據的方式是使用序列化。

重「慢到地獄」,你能量化嗎?使用哪種序列化機制? (BinaryFormatterXmlSerializer?)。有關信息,您可能會對protobuf-net感興趣,它是一種非常快速且高效的替代二進制序列化器(並提供了非常方便的T DeepClone<T>(T)方法) - 但是,它只適用於以特定方式標記的類(例如,它可以使用[DataContract]標記,或使用定製的[ProtoContract]標記)。不過,它的內置序列化程序是quicker

唯一的其他可行的選擇是寫你自己的,每類型的深拷貝例程,也許可以將它作爲你的擴展方法(作爲Func<T,T>Converter<T,T>委託)傳遞給你。

如果你只想要一個副本,事情變得更容易,因爲你可以使用反射等Here's an option創建使用編譯Expression(.NET 3.5),以提高性能淺表副本。

+0

謝謝Marc。我使用的是這[一] [1]。但它非常慢,用於渲染器,所以整個過程減慢了3-4倍。 你知道.NET團隊是否會爲此實現一種特殊的方法嗎? [1]:http://www.developerfusion.com/code/8063/deep-clone-an-object-in-net/ – 2009-01-07 18:50:36

+0

btw如何正確添加評論鏈接? – 2009-01-07 18:51:10

-1

我會先採取射擊在此:

internal static class Prototype 
{ 
    public static T DeepCopy<T>(this IPrototype<T> target) 
    { 
    T copy; 
    using (var stream = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter(); 
     formatter.Serialize(stream, (T)target); 
     stream.Seek(0, SeekOrigin.Begin); 
     copy = (T) formatter.Deserialize(stream); 
     stream.Close(); 
    } 
    return copy; 
    } 
} 

如果你想這是沒有那麼快,那麼優化會。