对于我的瓷砖游戏我正在选择使用4D嵌套列表系统。
我有精确的图层数量以及地图的高度和宽度。使用这些数字初始化前三个维度然后用空对象列表填充每个“tile”(即第四个维度)的好方法是什么?
以下是一些可以更好地说明它的代码:
List<List<List<List<GameObject>>>> Grid;
public readonly int Layers, Height, Width;
答案 0 :(得分:2)
如果其中三个尺寸具有固定长度,则可以改为使用数组:
List<GameObject>[,,] Grid = new List<GameObject>[Layers, Width, Height];
for(var l = 0; l < Layers; l++)
for(var x = 0; x < Width; x++)
for(var y = 0; y < Height; y++)
{
Grid[l, x, y] = new List<GameObject>();
}
如果你真的需要列表(IMO看起来好多了):
List<List<List<List<GameObject>>>> Grid = new List<List<List<List<GameObject>>>>();
for(var l = 0; l < Layers; l++)
{
Grid.Add(new List<List<List<GameObject>>>());
for(var x = 0; x < Width; x++)
{
Grid[l].Add(new List<List<GameObject>>());
for(var y = 0; y < Height; y++)
{
Grid[l][x].Add(new List<GameObject>());
}
}
}
答案 1 :(得分:2)
您可以使用linq:
执行此操作List<List<List<List<GameObject>>>> Grid;
Grid = Enumerable.Range(0, Layers).Select(l =>
Enumerable.Range(0, Height).Select(h =>
Enumerable.Range(0, Width).Select(w =>
new List<GameObject>()).ToList()).ToList()).ToList();
相同的代码可用于生成数组数组(或任何组合更灵活地满足您的需要),即:
List<GameObject>[][][] Grid;
Grid = Enumerable.Range(0, Layers).Select(l =>
Enumerable.Range(0, Height).Select(h =>
Enumerable.Range(0, Width).Select(w =>
new List<GameObject>()).ToArray()).ToArray()).ToArray();