C#学习笔记 -- 数组: 一维数组、矩形数组

发布时间 2023-05-27 00:14:56作者: Phonk

1、数组定义

  • 元素: 数组的独立数据项是元素, 类型相同或继承自同一类型

  • 秩/维度: 数组的维度可以为任何正数

  • 维度长度: 每一维度的长度

  • 数组长度: 数组中所有维度中的严肃总数

注意
  • 数组一旦创建, 大小固定, 不支持动态数组

2、数组分类

  • 一维数组: 可以认为是单行元素或元素向量

  • 多维数组: 是由主向量中的位置组成的, 每个位置本身又是一个数组, 称为字数组, 子数组向量中的位置本身又是一个子数组

    • 矩阵数组

      • 某个维度的所有子数组具有相同的长度的多为数组

      • 不管有多少维, 总是用一组方括号表示

        int x = myArray[4, 6, 1];//三维
    • 交错数组

    • 每一个子数组都是独立数组的多位数组

    • 可以有不同长度的子数组

    • 为数组的每个维度使用一对方括号

      jagArray[2][7][4];

3、数组是对象

数组实例是继承自System.Array的对象, 由于数组从BCL基类派生, BCL基类中有很多有用的成员

  • Rank 返回数组维度数的属性

  • Lenth 返回数组长度的属性(数组中所有元素的个数)

数组是引用类型, 与所有引用类型一样, 数组有数据的引用以及对象本身, 引用在栈或堆上, 而数组对象本身总是在堆上

尽管数组是引用类型, 但是数组的元素可以是值类型也可以是引用类型

  • 存储的元素都是值类型, 数组被称为类型数组

  • 存储的元素都是引用类型, 被称为引用类型数组

4、一维、矩阵数组

声明

long[,,,] sencondArray;
  • 方括号里的逗号就是秩说明符, 他们指定了数组的维度数, 逗号数 + 1 = 维数

  • 不能在数组类型区域放数组维度长度, 秩是数组类型的一部分, 而维度长度不是类型的一部分

  • 数组声明后, 维度数就是固定的, 然而维度擦好牛高度直到数组实例化才会确定

5、实例化

int[] arr2 = new int[4];
MyClass[] mcArr = new MyClass[4];
int[,,] arr3 = new int[3, 6, 2]; //三维数组, 长度是3*6*2 = 36
  • arr数组是包含4个int的一维数组

  • mcArr数组是包含4个MyClass引用的一维数组

6、访问数组元素

  • 每个维度的索引从0开始

  • 方括号内的索引在数组名称之后

int[,] intArr2 = new int[5, 10];//二维数组
intArr2[2, 3] = 7; //向二维数组写入元素
int var2 = intArr2[2, 3]; //读二维数组元素

7、初始化

当数组被创建之后, 每一个元素被自动初始化为类型的默认值, 对于预定义的类型, 整型默认值0, 浮点默认值0.0, bool默认值false, 引用默认值null

int[] intArr = new int[4];

(1)显式初始化一维数组

对于一维数组, 实例化后加上一个初始化列表

int[] intArr = new int[] {10, 20, 30, 40};
  • 不必输入维度长度, 因为编译器可以通过初始化的值的个数来判断长度

  • 在数组创建表达式和初始化列表中间没有分隔符

(2)显式初始化矩阵数组

int[,] intArry2 = new int[,] {{10, 1}, {2, 10}, {11, 9}};
  • 每个初始量向量必须封闭在大括号内

  • 每个维度也必须签到并封闭在大括号内

  • 除了初始值, 每个维度的初始化列表必须用逗号分割

(3)初始化矩形数组

矩形数组使用嵌套的, 逗号分割的初始化列表进行初始化, 初始化列表嵌套在大括号内. 这有时会造成混淆, 因此, 对于嵌套、分组和逗号的正确使用如下

  • ,用作元素和分组之间的分隔符

  • ,不在左大括号之间使用

  • ,不在右大括号之间使用

  • 使用缩进和回车来分组

  • 左向右阅读秩说明符, 指定最后一个数字作为元素, 其他数字作为分组

int[,,] matrixArray = new int[行数, 列数, 元素个数]{};
int[,,] intArray = new int[4,3,2]{
    { {1, 1}, {1, 2}, {1, 3} },
    { {2, 1}, {2, 2}, {2, 3} },
    { {3, 1}, {3, 2}, {3, 3} },
    { {4, 1}, {4, 2}, {4, 3} }
};

(4)快捷语法

在一条语句中使用声明、数组、初始化创建时, 我们可以省略语法的数组创建表达式部分, 只需提供初始化部分

int[] arr1 = new int[3] {1, 2, 3};
//等价
int[] arr1 = {1, 2, 3};
int[,] arr2 = new int[2, 3] { {1, 2, 3}, {4, 5, 6} };
//等价与
int[,] arr2 = { {1, 2, 3}, {4, 5, 6} };

(5)隐式类型数组

  • 当初始化数组时, 可以让编译器根据处死和化语句的类型来判断数组, 只要所有初始化语句能隐式转换为单个类型, 就可以这么做

  • 和隐式类型局部变量一样, 使用var关键字来代替数组类型

//显式
int[] intArr1 = new int[] {10, 20, 30};
//隐式
var intArr1 = new {10, 20, 30};
//显式
int[,] intArr3 = new int[2, 2] {{1, 2}, {3, 4}};
//隐式
var intArr3 = new {{1, 2}, {3, 4}};
例子
static void Main(string[] args)
{
    //1307_6
    {
        var arr = new int[2, 3] { { 0, 1, 2 }, { 10, 11, 12 } };
        Console.WriteLine($"arr维数: {arr.Rank}");
        Console.WriteLine($"arr维数: {arr.GetLength(0)}");
        for (int i = 0; i < arr.GetLength(0); i++) //i: 1维元素数 ==> 秩数
        {
            for (int j = 0; j < arr.GetLength(1); j++) //j: 1维的元素数
            {
                Console.WriteLine($"Element[{i}, {j}]: {arr[i, j]}");
            }
        }
    }
}