如何在C#中克隆一个通用的列表?

15 浏览
0 Comments

如何在C#中克隆一个通用的列表?

我在C#中有一个泛型对象列表,并希望克隆该列表。列表中的项目是可克隆的,但似乎没有一个选项可以执行list.Clone()

是否有简单的方法解决这个问题?

admin 更改状态以发布 2023年5月24日
0
0 Comments

你可以使用扩展方法。

static class Extensions
{
    public static IList Clone(this IList listToClone) where T: ICloneable
    {
        return listToClone.Select(item => (T)item.Clone()).ToList();
    }
}

0
0 Comments

如果你的元素是值类型,那么你可以这样做:

List newList = new List(oldList);

然而,如果它们是引用类型,并且你想要一个深度拷贝(假设你的元素正确实现了ICloneable接口),那么你可以这样做:

List oldList = new List();
List newList = new List(oldList.Count);
oldList.ForEach((item) =>
    {
        newList.Add((ICloneable)item.Clone());
    });

显然,在上面的泛型中替换ICloneable和转换为你的元素类型实现ICloneable

如果你的元素类型不支持ICloneable,但拥有一个拷贝构造函数,那么你可以这样做:

List oldList = new List();
List newList = new List(oldList.Count);
oldList.ForEach((item)=>
    {
        newList.Add(new YourType(item));
    });

个人而言,我会避免使用ICloneable,因为需要确保所有成员的深度拷贝。相反,我建议使用拷贝构造函数或类似YourType.CopyFrom(YourType itemToCopy)的工厂方法来返回一个新的YourType实例。

任何这些选项都可以由方法(扩展或否则)包装起来。

0