【问题标题】:Copying large List<T> and prevent changing the original复制大 List<T> 并防止更改原始文件
【发布时间】:2016-09-08 11:08:26
【问题描述】:

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

到目前为止,我发现的唯一方法是将列表逐项复制到另一个列表,每次创建新的 custom_class() 消耗约 50 毫秒,这在我的情况下是不可接受的。

到目前为止我尝试的是:

AnotherOriginal = Original.AsReadOnly().tolist();  
copy = original.tolist();  

修改copy[0].testvariable 将同时修改:AnotherOriginal 和 original。 和

我也试过了

ImmutableList test = original.ToImmutableList()

修改test[0].testvariable也会反映到原来的!

在不必将项目逐个添加到另一个列表的情况下,将副本传递给函数的最快方法是什么?防止修改原始列表。

当前的深拷贝代码(我需要增强):

List<FP_Point> particles = new List<FP_Point>();
foreach (FP_Point p in originalParticles)
{
    particles.Add(new FP_Point() { ID = p.ID, ZonesIDs = p.ZonesIDs, Location = new Point(p.Location.X, p.Location.Y), Readings = p.GetReadings() });
}
return particles;

自定义类:

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;
}

【问题讨论】:

标签: c# .net wcf


【解决方案1】:

除了克隆选择和假设GetReadings() 函数返回List&lt;Readings&gt; 的新实例之外,还可以使用以下方法:

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

【讨论】:

  • 这与当前使用的函数所用的时间几乎相同。
猜你喜欢
  • 2016-12-01
  • 2022-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多