首页 > 解决方案 > 我如何能够在 C# 中的一维数组的二维数组中实例化多个对象

问题描述

所以我试图有一个二维数组的数组(所以[,] [])

尽管出于某种原因,它们最终都返回 Null (很可能是由于没有分配给数组)

Edit1:代码中修复了错误。谢谢。Edit2:固定标题,因为它实际上是一维数组的二维数组。

例子:

public Environment()
{
    _grid2D = new Object[20, 20][];
}

我也尝试稍后在我的代码中为它们分配对象:

public GenerateGrid() 
{
    Random rand = new Random();
    for (int i = 0; i < 10; i++ ) 
    {
        obj = new InsertObject(rand.Next(0,19), rand.next(0,19));
        _grid2D[InsertObject.XPos, InsertObject.YPos][0] = obj;
    }
}

我正在尝试使用这种阵列,因为我需要看似多个 2D 平面,它们相互堆叠在一起。这样,多个游戏对象在技术上可以存在于同一空间中,因为 2D 数组是一个包含位置的数组(X 和 Y 属性已在别处定义)

这可能有点令人费解,因为可能有更好的方法。

我需要一个 20x20 的网格,这个网格有多个平面。

随机决定位置是一种设计选择,当同一位置有多个对象时,我会检查这一点并防止/重新分配位置(再次兰特)。

标签: c#arraysobject

解决方案


我在猜测,但我认为您要做的是在 2D 数组的每个单元格中允许任意数量的“InsertObject”对象。我猜,根据您在将每个对象添加到网格时随机选择 x,y 坐标的访问模式。

如果是这种情况,则在网格的每个单元格中使用一个列表。如果需要,您可以在添加第一个项目时分配每个列表,并使其保持稀疏(因此您不会为其中包含 0 个对象的单元格创建列表。)或者您可以在填充所有单元格的地方进行第一次传递具有空列表的二维数组。您采用的策略取决于您对效率的关注程度,以及您是否期望人口稀少或密集。

List<Object>[,] _grid2D = new List<Object>[20, 20];
Random rand = new Random();
for (int i = 0; i < 10; i++)
{
    int x = rand.Next(1, 20);
    int y = rand.Next(1, 19);
    Object obj = new object(); // Replace with your InsertObject here.
    if (_grid2D[x, y] == null) // If this cell's list doesn't exist yet...
    {
        _grid2D[x, y] = new List<Object>(); /// ... then make one.
    }
    _grid2D[x, y].Add(obj); // Add the object to the list.
}

如果您使用这种稀疏技术,请在访问网格时要小心,因为如果某些网格单元有 0 个对象(_grid2D[x,y] 可能为空),则它们可能没有创建列表。


如果您不想让每个网格单元有多个对象,那么您只需要一个 InsertObject 对象的 2D 数组。 InsertObject[,] _grid2D = new InsertObject[20,20];


推荐阅读