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 循环并用单行替换它?那太好了。
嵌套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)
| 归档时间: |
|
| 查看次数: |
2630 次 |
| 最近记录: |