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

createh54个月前 (02-01)技术教程39

在 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 中定义数组的语法有两种: type arrayName[]; type[] arrayName;type 为Java中的任...

算法:有序数组的平方(Java版)(java 有序数组)

有序数组的平方题目描述:给定一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例:输入: nums = [-4,-1,0,3,10] 输出: [0,1...

全新Java入门到架构师教程之Java15数组案例实现和Arrays

上篇文章写了《全新Java入门到架构师课程之Java15编程基础-数组(1):数组声明、初始化、数组元素的界限和遍历》,这次将接下去说java15编程之数组案例实现和Arrays一、数组基本练习//A...

[JAVA冷知识]什么是逆变与协变?数组是否支持协变&amp;逆变?泛型呢?

写在前面和小伙伴分享一些java小知识点,主要围绕下面几点:什么是逆变(contravariant)&协变(covariant)?数组支持协变&逆变吗?泛型支持协变&逆变吗?部分内容参考 《编写高质量...

02《数据结构入门教程》数组(数据结构数组的基本操作)

1. 前言数组是一种重要的数据结构,可以利用它作为基础来实现很多复杂的数据结构。因此我们要深入理解数组的存储原理和特点,熟悉它的常用操作,重点掌握它在声明、查询、存储、复制等操作时的效率,便于我们在今...

六十六、Leetcode数组系列(中篇)(leetcode684)

@Author:Runsen @Date:2020/6/8人生最重要的不是所站的位置,而是内心所朝的方向。只要我在每篇博文中写得自己体会,修炼身心;在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰难...