将值分配给 3D 列表无法正常工作


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)

到执行结束时,myList[0][8][10]myList[1][8][10]myList[2][8][10]处的值都PointF(4, 44)

我做错了什么?

在你的代码中,myListsubListsubSubList只分配一次:

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都是对同一个对象的引用,无论abcd是什么。所以当你写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>>();

最新更新