首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c#中反转2d数组

如何在c#中反转2d数组
EN

Stack Overflow用户
提问于 2022-04-20 13:22:00
回答 3查看 152关注 0票数 0

阵列:

代码语言:javascript
复制
int[,] nums = new int[3,4]{
    {6,7,9,8},
    {4,2,1,3},
    {9,7,0,4}
};

我需要反向打印出行,但保持列的顺序不变。

在互联网上,我甚至不知道从哪里开始我的代码,我所拥有的只是一个反向打印的for循环,但是当我运行我的代码时,什么都没有显示出来。

代码语言:javascript
复制
for (row = 3; row >= 0; row--)
{
    for (column = 0; column < 4; column++)
    {
        Console.Write("{0} ",nums[row,column]);
    }
}

我肯定遗漏了什么,唯一的错误就是超出界限的索引。

EN

回答 3

Stack Overflow用户

发布于 2022-04-20 13:32:30

请不要使用神奇的数字,如34,但是实际的数组长度,GetLength(...)

代码语言:javascript
复制
      int[,] nums = new int[3, 4] { 
        { 6, 7, 9, 8 }, 
        { 4, 2, 1, 3 }, 
        { 9, 7, 0, 4 }, 
      };

      for (int row = nums.GetLength(0) - 1; row >= 0; --row) {
        for (int column = 0; column < nums.GetLength(1); ++column)
          Console.Write($"{nums[row, column]} ");

        if (row > 0)
          Console.WriteLine();
      }

小提琴

票数 1
EN

Stack Overflow用户

发布于 2022-04-20 13:53:58

正如您所知道的,数组中的索引从0到上限,因此当循环遍历时,应该考虑对于具有3个元素的数组,您将拥有索引0、1和2,您正在尝试访问不存在的索引3。

高级语言有避免这种情况的安全措施,在这里抛出一个超出范围的类型异常,以让您知道您正在访问不属于数组的内存。

你应该避免直接索引,因为这很容易得到这些错误,你应该始终尝试使用范围为基础的循环,如果这是不可能获得数组的长度通过代码,不要使用硬编码的尺寸,除非你必须这样做。在这里,您可以使用成员方法来确定数组的界限:

代码语言:javascript
复制
int[,] nums = {
    {6,7,9,8},
    {4,2,1,3},
    {9,7,0,4}
};

for (var row = nums.GetUpperBound(0); row >= 0; row--)
{
    for (var column = 0; column < nums.GetLength(1); column++)
    {
        Console.Write("{0} ",nums[row,column]);
    }
    Console.WriteLine(); // line break for tiddy print
}
票数 1
EN

Stack Overflow用户

发布于 2022-04-20 13:44:52

(row = 3;>=行0;row--)

程序正在抛出OutOfRangeEception,因为当您有数组3,4时,行的最后一个索引是2。您的程序试图找到一个索引号过大的元素(3)。这里有工作代码

代码语言:javascript
复制
int[,] nums = new int[3, 4] { { 6, 7, 9, 8 }, { 4, 2, 1, 3 }, { 9, 7, 0, 4 } };
        for (int **row = 2**; row >= 0; row--)
        {
            for (int column = 0; column < 4; column++)
            {
                Console.Write("{0} ", nums[row,column]);
            }
            Console.WriteLine();
        }

如您所见,将for循环中的值从3更改为2解决了这个问题。我的一个重要提示--尝试声明反变量--如果你不需要的话,不要把它变成“全局的”。在更大的项目中,它可能需要更多的内存。当它在for中时,垃圾收集器将在所有循环之后销毁变量

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71940462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档