在 C# 中克隆列表 <List<T>> 的正确方法
Proper way to Clone a List<List<T>> in C#
我正在努力克隆引用类型的列表列表。我试图在我的参考 class 中实现 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;
}
}
您有一个 List<List<T>>
,其中 T
是 ICloneable
。
显然,对于每个 T
,您只需调用 Clone()
to get an 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()
,并且列表(外部和嵌套)是原始列表的单独实例。
使用 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();
}
我正在努力克隆引用类型的列表列表。我试图在我的参考 class 中实现 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;
}
}
您有一个 List<List<T>>
,其中 T
是 ICloneable
。
显然,对于每个 T
,您只需调用 Clone()
to get an 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()
,并且列表(外部和嵌套)是原始列表的单独实例。
使用 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();
}