克隆列表的正确方法<list <t>&gt;在C#中

时间:2016-02-09 00:19:49

标签: c# .net deep-copy icloneable

我正在努力克隆一个引用类型的列表列表。我尝试在我的引用类中实现ICloneable,但是,它似乎没有在其中调用Clone()方法。

代码:

public class Solid : ICloneable{

    private double[,] _points;  //vertices do solido
    private int[,] _edges;  //arestas do solido
    public int[,] Faces { get; private set; }   //faces do solido

    public int[,] Edges {
        get { return _edges; }
        set { _edges = value; }

    }
    ...

    public object Clone() {
        MemoryStream ms = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();

        bf.Serialize(ms, this);

        ms.Position = 0;
        object obj = bf.Deserialize(ms);
        ms.Close();
        return obj;
    }
}

2 个答案:

答案 0 :(得分:5)

使用LINQ,您可以执行以下操作:

public List<List<T>> Clone<T>(List<List<T>> original) where T : ICloneable
{
    return original
        .Select(sl => sl.Select(x => (T)x.Clone()).ToList())
        .ToList();
}

答案 1 :(得分:4)

您有T,其中TICloneable

显然,对于每个T,您只需致电Clone()即可获得object(您可以通过退回来转换为public static List<List<T>> Clone<T>(List<List<T>> original) where T : ICloneable { var result = new List<List<T>>(); foreach ( List<T> innerList in original ) { var innerResult = new List<T>(); foreach ( T item in innerList ) { var clone = (T)item.Clone(); innerResult.Add(clone); } result.Add(innerResult); } return result; } ),但要获得克隆你需要的嵌套列表如下:

Clone()

这将确保在每个T上调用FuzzyHash,并且列表(外部和嵌套)是与原始列表分开的实例。