1

参照型のリストのリストを複製するのに苦労しています。参照クラスに実装しようとしましたが、メソッド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;
    }
}
4

2 に答える 2

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();
}
于 2016-02-09T00:47:11.870 に答える
4

あなたは を持って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;
}

これにより、Clone()が各 で呼び出されT、リスト (外部およびネストされた) が元のインスタンスとは別のインスタンスになることが保証されます。

于 2016-02-09T00:35:54.873 に答える