在 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;
}
}
使用 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()
,并且列表(外部和嵌套)是原始列表的单独实例。