【问题标题】:C#: Build 3D-Array and fill it with dataC#:构建 3D-Array 并用数据填充它
【发布时间】:2015-07-28 18:50:58
【问题描述】:

到目前为止我尝试过的代码如下:

private static List<List<List<int>>> threeDArrayToThreeDList(int [,,] letters) {
    // 3d-array to 3d-list
    List<List<List<int>>> letterslist = new List<List<List<int>>>();
    List<List<int>> sublist = new List<List<int>> ();
    List<int> subsublist = new List<int> ();

    for (int i = 0; i < 2; i++) {
        letterslist.Add (sublist);
        for (int j = 0; j < 2; j++) {
            letterslist[i].Add (subsublist);
            for (int k = 0; k < 2; k++) {
                Console.WriteLine (letterslist [i][j][k]); // Element not found         
                Console.WriteLine (letters [i,j,k]);
                letterslist [i] [j] [k] = letters [i,j,k];
            }
        }
    }
    return letterslist;
}

为什么没有找到字母列表 [i][j][k]?

【问题讨论】:

  • 您是否确保例如 letterslist[3] 不为空?我没有看到为每个父位置创建列表实例的代码。
  • Why letterslist [i][j][k] isn't found? 因为subsublist 是空的。
  • 子子列表已创建,但为空。因此, letterslist[0][0][0] 会触发异常。
  • 另请注意,您正在使用subsublistsame 实例填充sublist,并使用@987654327 的same 实例填充letterlist @.
  • @kame:因为你的列表是空的。您无法访问letterslist[0][0][0],因为letterslist[0][0].Count == 0

标签: c# arrays list multidimensional-array


【解决方案1】:

您的代码错误。您需要为每个“索引”创建一个列表。您的代码总共只创建了 3 个列表。

它的工作原理如下:

private static List<List<List<int>>> threeDArrayToThreeDList(int [,,] letters) {
    // 3d-array to 3d-list
    List<List<List<int>>> letterslist = new List<List<List<int>>>();

    for (int i = 0; i < 2; i++) {
        letterslist.Add (new List<List<int>> ());
        for (int j = 0; j < 2; j++) {
            letterslist[i].Add (new List<int> ());
            for (int k = 0; k < 2; k++) {
                Console.WriteLine (letters [i,j,k]);
                letterslist [i] [j].Add(letters [i,j,k]);
            }
        }
    }
    return letterslist;
}

【讨论】:

  • 并且使用Array.GetLength 可能比硬编码这些长度更好。
  • @HamletHakobyan - 这是一个提示吗?老实说...从手机发帖 :-) 请更正您看到的内容(答案对于演示正确的解决方案很有用,即使它不准确,但应根据需要进行修复)
  • 关于长度......好吧,我没有假设代码应该做什么(例如,如果意图真的是在每个深度中只运行到 2,而不管实际界限?)
  • 我需要休息一下。现在输入太多了。 :) 数组要大得多。我想知道,因为 letterslist[i][j].Add(...) 看起来像一个二维数组!?!?!?!?
  • 这会将元素添加到第 3 维,很像 list.add(..) 将元素添加到第 1 维
【解决方案2】:

这是因为 letterslist [i][j] 列表中没有元素。 向其中添加一个元素,它将引导您完成导致异常的行。

将最内层循环中的代码改成如下:

for (int k = 0; k < 2; k++) {
    letterslist[i][j].Add (letters[i, j, k]);
    Console.WriteLine(letterslist[i][j][k]); // Should work fine
    Console.WriteLine(letters[i, j, k]);
}

【讨论】:

  • 这个答案不仅缺少我的答案中包含的关键信息,而且在当前状态下也不正确。在 i = 0 & j = 0 之后的迭代中,2 个控制台输出将不匹配。此答案中唯一“正确”的信息是在添加元素之前尝试“读取” letterlist[i][j][k] 是错误的。 (也可以将其添加为评论,因为它对我的回答中未包含的重要内容没有任何贡献)
猜你喜欢
  • 2021-12-19
  • 2018-07-28
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2018-02-14
  • 1970-01-01
相关资源
最近更新 更多