在c#中初始化多维对象数组

Tim*_*aax 2 .net c# arrays multidimensional-array

我只是想知道,是否有更好的方法来初始化 C# 多维对象数组(引用类型)。

这是我的代码:

Board = new Field[BoardHeight, BoardWidth];

for (int i = 0; i < BoardHeight; i++)
{
    for (int j = 0; j < BoardWidth; j++)
    {
        Board[i, j] = new Field();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我可以摆脱 for/for 循环并用单行替换它?那太好了。

Ale*_*kov 5

嵌套for循环通常是初始化二维数组的最易读/接受的方法。

如果您确实需要单个语句 - 一种选择是使用Enumerable.Aggregate(在单个语句中创建/填充数组)和Enumerable.Range+ Enumerable.SelectMany(使用How do I take the Cartesian join of Two list in c#?创建索引):

 Board = Enumerable.Range(0, BoardHeight)
         .SelectMany(x => Enumerable.Range(0, BoardWidth), (row,col)=>new {row,col})
         .Aggregate(new Field[BoardHeight, BoardWidth],
             (board, position)=> 
               {
                   board[position.row,position.col] = new Field(); 
                   return board;
               });
Run Code Online (Sandbox Code Playgroud)

(此代码的可读性有待讨论)

更实用的解决方案:

for (var i = 0; i < BoardHeight* BoardWidth; i++) 
{
    Board[i / BoardWidth, i % BoardWidth] = new Field();
}
Run Code Online (Sandbox Code Playgroud)

如果您确实需要“单行初始化” - 将嵌套循环重构for为方法(可能是通用的),并在您想要的任何地方使用“单行”调用它。就像是:

   public TField[,] InitializeArray<TField>(
      int BoardHeight, int BoardWidth) where TField:new()
   {
        var Board = new TField[BoardHeight, BoardWidth];

        for (int i = 0; i < BoardHeight; i++)
        {
            for (int j = 0; j < BoardWidth; j++)
            {
                Board[i, j] = new TField();
            }
        }
        return Board;
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,那太丑了。我永远不会在任何严肃的代码库中使用这样的代码。但是,是的,解决了OP的问题。 (3认同)