讲解C#中多维数组的长度和范围的特性和使用方法

createh53个月前 (02-01)技术教程23

在 C# 中,多维数组是一种可以包含多个维度(通常是二维或三维)的数组类型。理解其长度和范围的特性有助于正确使用和避免错误。以下是多维数组的长度、范围特性及其使用方法的详细讲解。


1. 多维数组的定义和初始化

定义多维数组

在 C# 中,多维数组是通过 [,] 或其他维度符号定义的。例如:

  • 二维数组:int[,] matrix = new int[3, 4];
  • 三维数组:int[,,] cube = new int[2, 3, 4];

初始化多维数组

多维数组可以在声明时直接初始化:

int[,] matrix = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

2. 多维数组的长度

Length 属性

  • 定义:Length 属性表示数组中所有元素的总数。
  • 示例
int[,] matrix = new int[3, 4]; // 3 行 4 列,共 12 个元素
Console.WriteLine(matrix.Length); // 输出: 12

GetLength 方法

  • 定义:GetLength(dimension) 返回指定维度的长度。
  • 示例
int[,] matrix = new int[3, 4];
Console.WriteLine(matrix.GetLength(0)); // 输出: 3 (行数)
Console.WriteLine(matrix.GetLength(1)); // 输出: 4 (列数)

3. 多维数组的范围

GetLowerBound 和 GetUpperBound 方法

  • 定义:GetLowerBound(dimension):返回指定维度的起始索引。GetUpperBound(dimension):返回指定维度的结束索引。
  • 注意:在 C# 中,数组的索引通常从 0 开始。
  • 示例
int[,] matrix = new int[3, 4];
Console.WriteLine(matrix.GetLowerBound(0)); // 输出: 0 (行的起始索引)
Console.WriteLine(matrix.GetUpperBound(0)); // 输出: 2 (行的结束索引)
Console.WriteLine(matrix.GetLowerBound(1)); // 输出: 0 (列的起始索引)
Console.WriteLine(matrix.GetUpperBound(1)); // 输出: 3 (列的结束索引)

4. 多维数组的访问和遍历

访问单个元素

使用逗号分隔的索引访问指定位置的元素:

int[,] matrix = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};
Console.WriteLine(matrix[1, 2]); // 输出: 6

遍历多维数组

可以使用嵌套循环遍历所有元素:

int[,] matrix = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

for (int i = 0; i < matrix.GetLength(0); i++) // 遍历行
{
    for (int j = 0; j < matrix.GetLength(1); j++) // 遍历列
    {
        Console.Write(matrix[i, j] + " ");
    }
    Console.WriteLine();
}

5. 多维数组的特点

  • 固定大小:多维数组在声明时确定其大小,无法动态调整。
  • 高维支持:C# 支持二维及更高维的数组,但通常使用不超过三维。
  • 性能优化:多维数组在内存中是连续存储的,性能比使用嵌套数组(如 int[][])稍高。

6. 实用示例

矩阵转置

将二维数组的行列互换:

int[,] matrix = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

int[,] transposed = new int[matrix.GetLength(1), matrix.GetLength(0)];

for (int i = 0; i < matrix.GetLength(0); i++)
{
    for (int j = 0; j < matrix.GetLength(1); j++)
    {
        transposed[j, i] = matrix[i, j];
    }
}

for (int i = 0; i < transposed.GetLength(0); i++)
{
    for (int j = 0; j < transposed.GetLength(1); j++)
    {
        Console.Write(transposed[i, j] + " ");
    }
    Console.WriteLine();
}

查找最大值

查找二维数组中的最大值:

int[,] matrix = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

int max = int.MinValue;

for (int i = 0; i < matrix.GetLength(0); i++)
{
    for (int j = 0; j < matrix.GetLength(1); j++)
    {
        if (matrix[i, j] > max)
        {
            max = matrix[i, j];
        }
    }
}

Console.WriteLine("最大值: " + max); // 输出: 最大值: 9

7. 多维数组与其他语言的比较

特性

C#

Python

Java

起始索引

0

0

0

多维数组声明

固定维度,int[,]

嵌套列表实现

固定维度,int[][]

内存布局

连续内存

非连续(列表)

引用(非连续)

边界检查

自动

自动

自动


总结

多维数组是 C# 提供的强大工具,适用于处理矩阵、图形数据等场景。理解其长度和范围的特性,有助于编写高效、安全的代码。在实际应用中,需要权衡多维数组的使用与动态结构(如 List<List<int>>)的灵活性,选择适合特定需求的方式。

相关文章

Java学习之数组——java基础篇(java数组知识)

如果希望保存一组有相同类型的数据,可以使用数组。数组的定义和内存分配Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName;type 为Java中的任...

灵魂拷问:如何检查 Java 数组中是否包含某个值?

作者 | 沉默王二责编 | Elle在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题。比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研...

二十、Java数组(java数组的使用)

数组的基本概念数组是一种可以存储多个相同类型数据的数据结构,这些数据在内存中是连续存储的。数组中的每个数据项称为数组的元素,每个元素都可以通过索引来访问。Java中的数组属于对象类型,数组中的可以是基...

小菜鸟学Java--如何拿下数组(java数组截取到新数组)

前面谈及到了引用数据类型,数组就是一种,它还是比较重要的一种,本篇就来详细说说它和向量。数组先来说说数组。那么什么是数组呢?它是在数组的基础上的。数组是一种常用的引用数据类型,相同数据类型的元素按照一...

java互联网架构师,教你学java基本的程序设计结构:大数值+数组

大数值如果基本的整数和浮点数精度不能满足需求,就可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理任意长度的数值。BigInteger类实现了...

Java 18 正式发布:附带简易 HTTP 服务器,弃用 Finalization

甲骨文(Oracle)发布了 Java 编程语言和虚拟机的第 18 版。该版本的最终特性主要集中在以下 9 个 JEP 上:JEP 400:默认字符集为UTF-8JEP 408:简易Web服务器JEP...