Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复制大型列表<;T>;并防止更改原件_C#_.net_Wcf - Fatal编程技术网

C# 复制大型列表<;T>;并防止更改原件

C# 复制大型列表<;T>;并防止更改原件,c#,.net,wcf,C#,.net,Wcf,我有一个列表,包含11k项,列表在初始化时填充,我需要传递一个函数的副本,该函数将修改传递的列表项,而不修改原始副本 到目前为止,我找到的唯一方法是通过创建新的自定义_类()将列表逐项复制到另一个列表中,每次都会消耗~50ms,这在我的情况下是不可接受的 到目前为止,我尝试的是: AnotherOriginal = Original.AsReadOnly().tolist(); copy = original.tolist(); 修改副本[0]。testvariable将同时修改:另一

我有一个列表,包含11k项,列表在初始化时填充,我需要传递一个函数的副本,该函数将修改传递的列表项,而不修改原始副本

到目前为止,我找到的唯一方法是通过创建新的自定义_类()将列表逐项复制到另一个列表中,每次都会消耗~50ms,这在我的情况下是不可接受的

到目前为止,我尝试的是:

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();