使用空元素初始化多维列表的好方法?

时间:2013-04-04 11:08:10

标签: c# list multidimensional-array initialization nested-lists

对于我的瓷砖游戏我正在选择使用4D嵌套列表系统。

  • 第一维 - 图层(背景和前景但可能还有其他图标)
  • 第二维和第三维 - 2D网格,基于图块的游戏的经典
  • 第四维 - 网格中的图块包含的对象(例如,多个项目可以放在同一个地板图块上的胭脂

我有精确的图层数量以及地图的高度和宽度。使用这些数字初始化前三个维度然后用空对象列表填充每个“tile”(即第四个维度)的好方法是什么?

以下是一些可以更好地说明它的代码:

List<List<List<List<GameObject>>>> Grid;
public readonly int Layers, Height, Width;

2 个答案:

答案 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();