【问题标题】:Array written as name[x, y] rather than name[x][y] [duplicate]数组写为 name[x, y] 而不是 name[x][y] [重复]
【发布时间】:2012-08-08 01:34:45
【问题描述】:

这两种语法有什么区别?

【问题讨论】:

    标签: c# .net arrays


    【解决方案1】:

    第一个是多维数组,第二个是锯齿状数组。您可以查看this question 以了解两者之间的差异,但这里有一个重要的片段:

    一个多维数组创建了一个很好的线性内存布局,而一个 锯齿状数组意味着几个额外的间接级别。

    在锯齿状数组中查找值 jagged[3][6] var jagged = new int[10][5] 的工作方式如下:查找索引 3 处的元素(即 一个数组)并在该数组中查找索引 6 处的元素(这是一个 价值)。在这种情况下,对于每个维度,都有一个额外的查找 (这是一种昂贵的内存访问模式)。

    一个多维数组在内存中线性布局,实际 通过将索引相乘来找到值。然而,鉴于 array var mult = new int[10,30] 的 Length 属性 多维数组返回元素的总数,即 10 * 30 = 300。

    锯齿状数组的 Rank 属性始终为 1,但 多维数组可以有任何秩。任何的 GetLength 方法 数组可用于获取每个维度的长度。为了 本例中的多维数组 mult.GetLength(1) 返回 30。

    索引多维数组更快,例如鉴于 本例中的多维数组 mult[1,7] = 30 * 1 + 7 = 37, 获取该索引 37 处的元素。这是更好的内存访问 模式,因为只涉及一个内存位置,即 数组的基地址。

    因此,一个多维数组分配一个连续的内存 块,而锯齿状数组不必是方形的。例如 jagged1.Length 不必等于 jagged[2].Length 这将 对任何多维数组都是如此。

    更新:

    multi 和 jagged 数组之间的一个主要区别是 multi 必须始终是“正方形”,这意味着任何两个索引在其子数组中都将具有相同数量的元素。锯齿状阵列没有这个要求。看看下面的代码:

    var jagged = new int[3][]; //not defining the size of the child array...
    var multi = new int[3,8]; //defining a 3x8 "square"
    var multiBad = new int[3,]; //Syntax error!
    var jaggedSquare= new int[3][8]; //another 3x8 "square"
    

    【讨论】:

    • 但它们本质上都做同样的事情?就使用它们而言,我的意思是(在浅层次上)
    • 另一方面,锯齿状数组可能是稀疏的,这样可以节省内存并提高多维数组的局部性。
    • @SirYakalot,不完全是。看看我的更新
    【解决方案2】:

    前者是一个二维数组。后者是一个数组,其元素也是数组。

    【讨论】:

      【解决方案3】:

      第一个是多维数组

      第二个是数组数组

      【讨论】:

        猜你喜欢
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多