Назначение значений в список 3D не работает должным образом - PullRequest
0 голосов
/ 02 февраля 2020
List<List<List<PointF>>> myList = new List<List<List<PointF>>>();
List<List<PointF>> subList = new List<List<PointF>>();
List<PointF> subSubList = new List<PointF>();
for(int x = 0; x<5; x++)
{
    for(int y = 0; y<15; y++)
    {
        for(int z = 0; z<15; z++)
        {
            subSubList.Add(new PointF(0, 0));
        }
        subList.Add(subSubList);
    }
    myList.Add(subList);
}
PointF first = new PointF(12, 12);
PointF second = new PointF(25, 14);
PointF third = new PointF(4, 44);

myList[0][8][10] = first;
myList[1][8][10] = second;
myList[2][8][10] = third;

Когда я отлаживаю каждую строку, first правильно присваивается myList[0][8][10], но после перехода к следующей строке значение myList[0][8][10] меняется на PointF(25, 14).

By конец выполнения, значения в myList[0][8][10], myList[1][8][10], myList[2][8][10] равны PointF(4, 44).

Что я сделал не так?

1 Ответ

1 голос
/ 03 февраля 2020

В вашем коде myList, subList и subSubList назначаются только один раз:

List<List<List<PointF>>> myList = new List<List<List<PointF>>>();
List<List<PointF>> subList = new List<List<PointF>>();
List<PointF> subSubList = new List<PointF>();

Так что везде эти переменные относятся к одним и тем же экземплярам. Следовательно, когда вы вставляете его:

subList.Add(subSubList);
...
myList.Add(subList);

Вы вставляете одни и те же ссылки несколько раз в один и тот же объект.

Что это:

  • myList[0] == myList[1] == .. myList[4] == subList.
  • myList[_][0] == myList[_][1] == .. myList[_][14] == subSubList независимо от того, что _.

Именно поэтому myList[a][b] и myList[c][d] и subSubList являются ссылками на один и тот же объект, независимо от того, a, b, c и d являются. Поэтому, когда вы пишете myList[2][8][10] = third;, это то же самое, что и запись subSubList[10] == third;, а чтение myList[a][b][10] - это то же самое, что и чтение subSubList[10].

Чтобы это работало, вы должны создавать новые объекты после вставок:

subList.Add(subSubList);
subSubList = new List<PointF>();

и

myList.Add(subList);
subList = new List<List<PointF>>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...