Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我们有交错数组和多维数组?_C#_.net_Arrays_Visual Studio 2010 - Fatal编程技术网

C# 为什么我们有交错数组和多维数组?

C# 为什么我们有交错数组和多维数组?,c#,.net,arrays,visual-studio-2010,C#,.net,Arrays,Visual Studio 2010,锯齿数组和多维数组的区别是什么。 一个对另一个有好处吗 为什么VisualStudio不允许我做一个 MyClass[][] abc = new MyClass[10][20]; < P>(我们以前在C++中这样做过,但是在C语言中,它用红色的RigggLY线表示[20)……无效秩说明符) 但是他很高兴 MyClass[,] abc = new MyClass[10,20]; 最后,我如何在一行中初始化它(就像我们在使用{new xxx…}{new xxx…}的简单数组中所做的那样) 锯

锯齿数组和多维数组的区别是什么。 一个对另一个有好处吗

  • 为什么VisualStudio不允许我做一个

    MyClass[][] abc = new MyClass[10][20];
    
    < P>(我们以前在C++中这样做过,但是在C语言中,它用红色的RigggLY线表示[20)……无效秩说明符)

    但是他很高兴

    MyClass[,] abc = new MyClass[10,20];
    
  • 最后,我如何在一行中初始化它(就像我们在使用
    {new xxx…}{new xxx…}
    的简单数组中所做的那样)


  • 锯齿数组是数组的数组。不能保证每个数组的大小相同。你本来可以的

    int[][] jaggedArray = new int[5][];
    jaggedArray[0] = new[] {1, 2, 3}; // 3 item array
    jaggedArray[1] = new int[10];     // 10 item array
    // etc.
    
    这是一组相关的数组

    另一方面,多维数组更像是一个内聚的分组,如长方体、表格、立方体等,其中没有不规则的长度。也就是说

    int i = array[1,10];
    int j = array[2,10]; // 10 will be available at 2 if available at 1
    
  • 锯齿状数组是数组的数组,因此
    int[][]
    int[]
    的数组,每个数组可以具有不同的长度,并在内存中占据各自的块。多维数组(
    int[,]
    )是单个内存块(本质上是一个矩阵)

  • 无法创建
    MyClass[10][20]
    ,因为每个子数组都必须单独初始化,因为它们是单独的对象:

    MyClass[][] abc = new MyClass[10][];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20];
    }
    

  • 请记住,CLR针对一维数组访问进行了大量优化,因此使用交错数组可能比使用相同大小的多维数组更快。

    矩形数组的每行列数始终相同

    MyClass[,] x = new MyClass[10,30]
    
    每行有30列,而在锯齿状数组中,这不是必需的。 因此,我认为您必须分别初始化锯齿数组中的每个“行”:

    MyClass[][] x = new MyClass[10][];
    
    for(int i = 0; i < 10; i++)
    {
        x[i] = new MyClass[30];
    }
    
    MyClass[]]x=新的MyClass[10][];
    对于(int i=0;i<10;i++)
    {
    x[i]=新的MyClass[30];
    }
    
    事实上,这意味着交错数组中并非每一行都必须包含相同数量的元素。(在我的示例中,它确实具有相同数量的元素,但这不是必需的)

    您完全可以做到这一点,例如:

    MyClass[][] x = new MyClass[10][];
    
    for(int i = 0; i < 10; i++)
    {
        x[i] = new MyClass[(30 + i)];
    }
    
    MyClass[]]x=新的MyClass[10][];
    对于(int i=0;i<10;i++)
    {
    x[i]=新的MyClass[(30+i)];
    }
    

    对您来说可能是一篇有趣的文章。

    如果您要查找具有设置边界的多维数组,请始终使用
    [,]
    样式语法。这将确保每个部分的大小相等

    当您使用
    [][]
    时,真正要做的是创建一个数组数组。这意味着每个阵列的大小可以不同。例如:

    int[][] jaggedArray = new int[5][]
    for(int index = 0; index < jaggedArray.Length ; ++index)
    {
        jaggedArray[index] = new int[index + 1];
    }
    
    int[]jaggedArray=新的int[5][]
    对于(int index=0;index
    内联声明如下所示:

    int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };
    
    有关#1,请参见

    对于交错或多维内联数组,请参见以下内容:


    您不必指定尺寸(array3D),但如果您知道它们永远不会改变,那么了解您使用的尺寸(array3Da)会很有帮助。

    您需要了解阵列的内部工作原理 多维数组充当一维数组,但双重索引转换为单个索引

    c#中的锯齿数组是一个对象数组,这些对象依次排列。

    Ad 3)要初始化像
    [],[],]
    这样的怪物,可以执行以下操作:

            int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } },
                                         { new int[,] { { 2, 2 }, { 1, 1 } },
                                             new int[,] { { 2, 2 }, { 1, 1 } } } };
            int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } },
                                         { new int[,] { { 2, 2 }, { 1, 1 } },
                                             new int[,] { { 2, 2 }, { 1, 1 } } } };
    
            int [][,][,] superMultiArray = { multiArr1, multiArr2 };
    

    我认为C++中的二维锯齿数组内存分配就像C++和C.中的2D数组。 因为2d交错数组有指向指针数组的指针,每个指针都指向元素数组(例如整数元素);像C++中的这个代码,

    int** 2DArr {new int* [number1]};
    for (int i = 0; i < number1; i++)
    {
       2DArr[i] = new int[number2];
    }
    
    int**2DArr{newint*[number1]};
    对于(int i=0;i

    下面代码的内存分配与C#中的2d锯齿数组相同。但我对此表示怀疑,如果我的想法不正确,你能解释一下吗。

    这篇文章很老了,但下面是我的想法

    交错数组是多维数组。多维数组有两种:矩形数组和锯齿数组。矩形数组表示一个n维内存块,锯齿状数组是数组的数组

    矩形阵列

    矩形数组使用逗号来分隔每个维度。下面的语句声明了一个矩形二维数组,其中的维数为3×3:

    int[,] matrix = new int [3, 3]; 
    
    锯齿状阵列

    交错数组使用连续的方括号来表示每个维度。下面是一个声明交错二维数组的示例,其中最外层的维度是3:

    int[][] matrix = new int[3][];
    

    对于多维数组,请考虑长方体或矩形。每行长度相同,每列长度相同

    在锯齿状数组中,行和列的大小可能不同。例如,列或行的大小可能不同。这将导致形状可能不是沿边向下的一条直线,就像矩形一样。相反,两边可能参差不齐


    现在我在这个例子中使用了2维/2数组,但这适用于更多的情况。

    锯齿数组的全部要点是“嵌套”数组不必具有统一的大小。-多维数组语法[X,Y]根据docsAdditional子问题是有效的:是否可以将foreach()用于多维数组?@Serge-当然,因为
    array
    实现了
    IEnumerable
    。您可以随时尝试并亲自查看:)可能的重复项您能为我们指出一些证据,证明一维数组访问更快吗?@GreyCloud-多维数组是否有(通用)用例?示例:棋盘格
    var board=新棋子[8,8],a
    var m=新的双精度[2,2]。我尝试了你的代码。它没有编译。尝试添加int[3],因此尝试
    jaggedArray[0]=int[3]{1,2,3}
    ;我知道我
    int** 2DArr {new int* [number1]};
    for (int i = 0; i < number1; i++)
    {
       2DArr[i] = new int[number2];
    }
    
    int[,] matrix = new int [3, 3]; 
    
    int[][] matrix = new int[3][];