初始化一个二维对象数组

3

我有一个二维对象数组,我使用传统的循环进行初始化:

PairDS[,] tempPb1 = new PairDS[LoopCounterMaxValue+1, LoopCounterMaxValue+1];
for (int i = 0; i <= LoopCounterMaxValue; i++)
   for (int j = 0; j <= LoopCounterMaxValue; j++)
      tempPb1[i, j] = new PairDS();

有没有更好的方法使用可枚举对象或其他东西来做这件事呢?

什么也没有,但它看起来很啰嗦。 - Russ Clarke
3个回答

1

无法直接使用 Enumerable 类型初始化2D数组,正如一些用户指出的那样,你所做的并没有什么明显的问题。但如果你只是想简化循环,那么这可能是你要找的解决方案;

const int length = LoopCounterMaxValue + 1;
PairDS[,] tempPb1 = new PairDS[length, lenth];
for (var i = 0; i < length * length; i++) {
  var column = i % length;
  var row = (i - column) / length;
  tempPb1[row, column] = new PairDS();
}

3
百分号(%)、除号(/)和乘号(*)这些运算符不具备简化功能,需要更多的时间来理解其含义。 - kyrylomyr
@archer我认为这是关于视角的问题。我个人发现它更容易阅读,因为我已经使用并看到它被使用了很多次。我相信一眼看上去它并不更简单。OP的问题对他们的意图不清楚,我想通过删除嵌套来提供简化。 - JaredPar

1

我以为Initialize可以做到,但它只适用于值类型。

int N = 10;
PairDS[,] temp = new PairDS[N + 1, N + 1];
temp.Initialize();

我建议你使用锯齿数组。
class PairDS { public PairDS(int row, int col) { } }


static void Main(string[] args)
{
    int N = 10;
    PairDS[][] temp = Enumerable.Range(0, N + 1).Select(
        (row) => Enumerable.Range(0, N + 1).Select(
            (col) => new PairDS(row, col)).ToArray()).ToArray();
}

是的,锯齿数组是另一个值得考虑的好主意。感谢您的合作。 - user906763

1

我不相信你可以直接将多维数组表示为可枚举或列表,因为(CLR)无法知道您打算如何索引该数组。

如果您逐行解决它,实际上比您正在执行的循环遍历数组并初始化每个单元格更糟糕(即更慢)。


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