初始化包含空元素的多维列表的好方法

本文关键字:列表 方法 包含空 元素 初始化 | 更新日期: 2023-09-27 18:07:25

对于我的贴图游戏,我选择使用4D嵌套列表系统。

  • 第一个维度-图层(背景和前景,但可能有其他)
  • 第二和第三维——二维网格,经典的基于贴图的游戏
  • 第四维—网格中瓷砖包含的对象(例如,多个物品可以掉落在rouge - like的同一地板瓷砖上)

我有一个确切的图层数量和地图的高度和宽度。用这些数字初始化前三个维度,然后用空对象列表填充每个"平铺"(即第四个维度)的好方法是什么?

下面是一些代码来更好地说明它:

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

初始化包含空元素的多维列表的好方法

可以使用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();

如果其中三个维度的长度是固定的,则可以使用数组来代替:

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>();
}

如果你真的需要列表(在我看来更糟糕):

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>());
        }
    }
}