2016-04-29 36 views
2

在C#中,如果我有一個IList,並且我不知道IList中對象的類型,如何創建一個IList的副本?如何將IList複製到相同類型的IList?

這裏的情況是:

我有一個CollectionEditor可以修改在IList項目。如果按下取消按鈕,我需要在項目更改前恢復IList

+3

你試過? –

+0

提示:查看IList 的文檔:https://msdn.microsoft.com/en-us/library/5y536ey6%28v=vs.110%29.aspx。 – devuxer

+0

您需要序列化列表,然後在需要時進行反序列化。 – bobah75

回答

4

這裏有兩個不同的問題。將列表複製到另一個列表是相對容易的 - 如果您不需要第二個列表是完全相同類型的具體列表,那麼您可以使用ToList(),否則您可能只需Add進行循環。但是,不會解決您的問題,除非這裏的T是不可變的。對於string,int等,這樣可以,但將引用複製到複雜類型將不允許您恢復列表,因爲可能已在UI中編輯了個人項目。要解決問題,你需要一個「深層複製」(或者有一些其他的策略,但這是最簡單的)。正如已經指出的那樣:進行深層複製的一種方法是:序列化。通過以XML,json或其他一些序列化格式拍攝數據的快照,可以通過「反序列化」實現「恢復」。

當然,如果您的T內置了深度克隆方法,您可能可以使用該方法而不是序列化。 ICloneable是深還是淺,這是不明確的,所以我不認爲這是堅持where T : ICloneable

0

ToList創建一個副本:

IList x = y.ToList(); 
+0

它不會複製。元素的引用將是相同的。你只是得到一個新的列表,但相同的元素。 –

+2

這會創建一個淺度副本,在這種情況下可能會或可能不足。 –

+0

很高興知道。我可能有一些代碼要改變! –