C# 复制大型列表<;T>;并防止更改原件
我有一个列表,包含11k项,列表在初始化时填充,我需要传递一个函数的副本,该函数将修改传递的列表项,而不修改原始副本 到目前为止,我找到的唯一方法是通过创建新的自定义_类()将列表逐项复制到另一个列表中,每次都会消耗~50ms,这在我的情况下是不可接受的 到目前为止,我尝试的是:C# 复制大型列表<;T>;并防止更改原件,c#,.net,wcf,C#,.net,Wcf,我有一个列表,包含11k项,列表在初始化时填充,我需要传递一个函数的副本,该函数将修改传递的列表项,而不修改原始副本 到目前为止,我找到的唯一方法是通过创建新的自定义_类()将列表逐项复制到另一个列表中,每次都会消耗~50ms,这在我的情况下是不可接受的 到目前为止,我尝试的是: AnotherOriginal = Original.AsReadOnly().tolist(); copy = original.tolist(); 修改副本[0]。testvariable将同时修改:另一
AnotherOriginal = Original.AsReadOnly().tolist();
copy = original.tolist();
修改副本[0]。testvariable
将同时修改:另一个原件和原件。
及
我也试过了
ImmutableList test = original.ToImmutableList()
修改test[0]。testvariable
也将反映到原始版本中
在不必逐个向另一个列表添加项的情况下,将副本传递给函数的最快方法是什么?防止对原始列表进行修改
当前深度复制代码(我需要增强):
List particles=new List();
foreach(原始粒子中的FP_点p)
{
添加(新的FP_点(){ID=p.ID,ZonesIDs=p.ZonesIDs,Location=new点(p.Location.X,p.Location.Y),Readings=p.GetReadings());
}
返回粒子;
自定义类:
public class FP_Point
{
public int ID { get; set; }
public Point Location { get; set; }
public List<Reading> Readings { get; set; }
public double Weight, Distance;
public List<int> ZonesIDs;
public double PreviousDistance;
}
公共类FP\u点
{
公共int ID{get;set;}
公共点位置{get;set;}
公共列表读数{get;set;}
公共双重、距离;
公共名单分区;
公共双先验距离;
}
除了克隆选项并假设GetReadings()
函数返回列表的新实例之外,还可以使用以下选项:
var particles = originalParticles.Select(p => new FP_Point()
{
ID = p.ID,
ZonesIDs = p.ZonesIDs != null ? p.ZonesIDs.ToList() : null,
Location = new Point(p.Location.X, p.Location.Y),
Readings = p.GetReadings(),
Distance = p.Distance,
PreviousDistance = p.PreviousDistance,
Weight = p.Weight
}).ToList();
有两种拷贝类型:浅拷贝和深拷贝。必须使用深度复制来防止数组列表之间的引用。尝试以下操作:可能重复的ToList()
将创建一个新列表,但两个列表都包含对相同对象的引用。您的foreach循环复制这些对象,这就是它工作的原因。这占用的时间与当前使用的函数几乎相同。
var particles = originalParticles.Select(p => new FP_Point()
{
ID = p.ID,
ZonesIDs = p.ZonesIDs != null ? p.ZonesIDs.ToList() : null,
Location = new Point(p.Location.X, p.Location.Y),
Readings = p.GetReadings(),
Distance = p.Distance,
PreviousDistance = p.PreviousDistance,
Weight = p.Weight
}).ToList();