【问题标题】:How to copy an array?如何复制数组?
【发布时间】:2019-02-07 12:46:10
【问题描述】:

我正在尝试创建一个临时数组

Stack<Point[]> v = new Stack<Point[]>();
Point[] c= new Point[4];

然后将其存储在堆栈中

v.Push(c);

但每次我尝试修改数组时,它也会修改堆栈内的每个instance

c[state] = mouse;

有没有办法将它复制到堆栈中?

【问题讨论】:

  • 你明白现在你的堆栈存储的是数组引用,而不是数组吗?如果要存储对数组新副本的引用,则必须制作该新副本。
  • Point 是什么?此外,数组只保存对对象的引用,而不是对象本身
  • 对不起XY problem,我试图在数组中存储一个贝塞尔线段,然后将其存储在堆栈中。

标签: c# arrays winforms stack gdi+


【解决方案1】:

是的。您的堆栈仅保留对数组的引用。您必须创建数组的副本。

Stack<Point[]> v = new Stack<Point[]>();
Point[] c = new Point[4];
v.Push(c);

c[0] = new Point(5, 5);
Point[] cc = new Point[c.Length];
Array.Copy(c, cc, c.Length);
cc[0] = cc[0];

c[0].X = 20;
c[0].Y = 20;
var cx = v.Pop();

Console.WriteLine(c[0]);
Console.WriteLine(cx[0]);
Console.WriteLine(cc[0]);

编辑:结果:

{X=20,Y=20}
{X=20,Y=20}
{X=5,Y=5}

【讨论】:

  • 我得到 {20,20} {20,20} {20,20}
【解决方案2】:

因为数组是引用类型,你使用的是同一个实例,所以每次修改数组的时候,也会修改栈中的每一个实例。

我会创建一个新的实例数组到Stack 而不是c,它可以拆分两个数组。

Stack<Point[]> v = new Stack<Point[]>();
Point[] c = new Point[4];
v.Push(new Point[4]);
c[0] = new Point(1, 1);

如果cPoint[]中有数据,可以尝试使用CopyTo将数据复制到另一个数组中。

Stack<Point[]> v = new Stack<Point[]>();
Point[] c = new Point[4];

Point[] pushArr = new Point[c.Length];
c.CopyTo(pushArr, 0);
v.Push(pushArr);

【讨论】:

  • v.Push(new Point[4]); c = v.Last(); 为我工作。
【解决方案3】:

当你这么说时:

int[] arr1=arr2; 

它不是简单地将一个变量的数据复制到另一个变量,而是存储一个引用。

我的问题的解决方法是:

v.Push(new Point[4]);
Point[] c = v.Last();

这里我将 'c' 指代我堆栈的最后一个变量。

之前发生的事情是,我将堆栈中的每个变量都引用到“c”。

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多