Как скопировать массив? - PullRequest
       9

Как скопировать массив?

0 голосов
/ 02 сентября 2018

Я пытаюсь создать временный массив

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

затем сохраните его в стеке

v.Push(c);

но каждый раз, когда я пытаюсь изменить массив, он также изменяет каждый instance внутри стека.

c[state] = mouse;

Есть ли способ скопировать его в стек?

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Поскольку массивы являются ссылочными типами, вы используете один и тот же экземпляр, поэтому каждый раз, когда я изменяю массив, он также изменяет каждый экземпляр внутри стека.

Я бы создал новый массив экземпляров для Stack вместо c, он может разделить два массива.

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

если в c Point[] есть какие-либо данные, вы можете попытаться использовать 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);
0 голосов
/ 02 сентября 2018

Когда вы говорите, что:

int[] arr1=arr2; 

Он не просто копирует данные одной переменной в другую, но вместо этого хранит ссылку.

Решение моей проблемы:

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

Здесь я ссылаюсь 'c' на последнюю переменную моего стека.

То, что происходило раньше, это то, что я ссылался на каждую переменную моего стека на 'c'.

0 голосов
/ 02 сентября 2018

Да. Ваш стек хранит только ссылку на массив. Вы должны создать копию массива.

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