在C#中,如果我有一個IList
,並且我不知道IList
中對象的類型,如何創建一個IList
的副本?如何將IList複製到相同類型的IList?
這裏的情況是:
我有一個CollectionEditor可以修改在IList
項目。如果按下取消按鈕,我需要在項目更改前恢復IList
。
在C#中,如果我有一個IList
,並且我不知道IList
中對象的類型,如何創建一個IList
的副本?如何將IList複製到相同類型的IList?
這裏的情況是:
我有一個CollectionEditor可以修改在IList
項目。如果按下取消按鈕,我需要在項目更改前恢復IList
。
這裏有兩個不同的問題。將列表複製到另一個列表是相對容易的 - 如果您不需要第二個列表是完全相同類型的具體列表,那麼您可以使用ToList()
,否則您可能只需Add
進行循環。但是,不會解決您的問題,除非這裏的T
是不可變的。對於string
,int
等,這樣可以,但將引用複製到複雜類型將不允許您恢復列表,因爲可能已在UI中編輯了個人項目。要解決那問題,你需要一個「深層複製」(或者有一些其他的策略,但這是最簡單的)。正如已經指出的那樣:進行深層複製的一種方法是:序列化。通過以XML,json或其他一些序列化格式拍攝數據的快照,可以通過「反序列化」實現「恢復」。
當然,如果您的T
內置了深度克隆方法,您可能可以使用該方法而不是序列化。 ICloneable
是深還是淺,這是不明確的,所以我不認爲這是堅持where T : ICloneable
。
ToList創建一個副本:
IList x = y.ToList();
它不會複製。元素的引用將是相同的。你只是得到一個新的列表,但相同的元素。 –
這會創建一個淺度副本,在這種情況下可能會或可能不足。 –
很高興知道。我可能有一些代碼要改變! –
你試過? –
提示:查看IList的文檔:https://msdn.microsoft.com/en-us/library/5y536ey6%28v=vs.110%29.aspx。 –
devuxer
您需要序列化列表,然後在需要時進行反序列化。 – bobah75