在 C# 中克隆列表>的正确方法

本文关键字:方法 List 列表 | 更新日期: 2023-09-27 18:33:41

我正在努力克隆引用类型的列表列表。我试图在我的参考类中实现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;
    }
}

在 C# 中克隆列表<List<T>>的正确方法

使用 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();
}

你有一个List<List<T>>,其中T ICloneable

显然,对于每个T,您只需调用Clone()即可获得object(您可以通过回投将其转换为T),但是要获取嵌套列表的克隆,您需要如下所示:

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;
}

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