如何将IList复制到相同类型的IList?

时间:2016-04-29 06:43:57

标签: c# list

在C#中,如果我有IList,并且我不知道IList中对象的类型,我该如何创建IList的副本?

情况如下:

我有一个CollectionEditor,可以修改IList中的项目。如果按下取消按钮,我需要在更改项目之前恢复IList

2 个答案:

答案 0 :(得分:6)

这里有两个不同的问题。将列表复制到另一个列表相对容易 - 如果您不需要第二个列表是完全相同类型的具体列表,则可以使用ToList(),否则您只能在循环中Add。但是,不会解决您的问题,除非此处T是不可变的。它适用于stringint等,但将引用复制到复杂类型将无法恢复列表,因为单个可能已被编辑在UI中。要解决那个问题,你需要一个“深层复制”(或者有一些其他策略,但这是最简单的)。正如已经指出的那样:执行深层复制的一种方法是:序列化。通过以XML,json或其他一些序列化格式获取数据的快照,可以通过“反序列化”实现“恢复”。

当然,如果您的T内置了深度克隆方法,您可以使用它而不是序列化。 ICloneable是深层还是浅层是不明确的,所以我认为坚持where T : ICloneable是不够的。

答案 1 :(得分:1)

ToList创建一个副本:

IList x = y.ToList();