如何在二维数组中初始化对象?

3

我得到了一个二维数组

BoardTile tiles[,];

然后在 Init(Point size) 中,我设置了它的大小:

tiles = new BoardTile[size.X, size.Y];

我应该如何初始化所有这些元素?因为它不使用默认的 BoardTile() 构造函数。它只是分配了 null

foreach(BoardTile t in tiles) t = new BoardTile()

这段代码无效。当我尝试调用时:

foreach(BoardTile t in tiles) t.anything()

我遇到了NullReferenceException错误。


使用for循环遍历每个维度。这在所有数组教程中都有所展示。foreach用于枚举集合。 - Panagiotis Kanavos
另外,那并不是动态大小的数组,数组大小在初始化后不会改变。 - SᴇM
1个回答

5
你可以尝试使用嵌套循环:
  for (int i = 0; i < titles.GetLength(0); ++i)
    for (int j = 0; j < titles.GetLength(1); ++j)
      titles[i, j] = new BoardTile();

编辑:如果嵌套循环太复杂和难以阅读,可以尝试切换到锯齿数组,即数组的数组-BoardTile tiles[][];-从2D转为一个BoardTile tiles[,],例如

   // created and initialized jagged array
   BoardTile tiles[][] = Enumerable
     .Range(size.Y)                      // size.Y lines
     .Select(y => Enumerable             // each line is
        .Range(size.X)                   //   size.X items
        .Select(x => new BoardTile())    //   each of them is BoardTile()
        .ToArray())                      //   materialized as array
     .ToArray();                         // all arrays are array of array 

这是唯一的方法吗?我考虑过这个解决方案,但对我来说似乎可以更容易地完成。 - SkillGG
@SkillGG:与锯齿形数组(数组的数组BoardTile[][])不同,多维数组(BoardTile[,])并不是很方便。 - Dmitry Bychenko
好的。谢谢你的帮助。我想我只能使用这个丑陋的双重循环初始化了。 - SkillGG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接