C#笔记(数组)

1 数组

数组实际上是由一个变量名称表示的一组 同类型 的数据元素,其中需要了解一些重要定义:

  • 数组是引用类型,实例是从 System.Array 继承的对象
  • 元素:数组的独立数据项称为 元素
  • 秩/维度:数组可以有任何为正数的维度数,数组的 维度数 称作
  • 维度长度:数组每个维度都有一个长度,就是 维度长度
  • 数组长度:数组的所有维度中的元素的总和称为 数组长度
  • 数组一旦创建,大小就固定了,C#不支持动态数组
  • C#提供两种类型的数组,一维数组多维数组,多维数组又可以分为 矩形数组交错数组;同时根据数组元素的类型,也可分为 值类型数组引用类型数组

1.1 一维数组和矩形数组

声明一维数组或矩形数组,可以在 类型变量名称 之间使用一对 方括号方括号内的逗号就是秩说明符,它们指定数组的维度数
要实例化数组,可以使用 数组创建表达式,数组创建表达式由 new 运算符构成,后面是 基类名称一对方括号方括号中以逗号分隔每个维度长度。eg:

int[,,] arr = new int[3,6,2];
//3,6,2 分别是维度长度 

1.1.1 初始化一维数组和矩形数组

当数据被创建之后,每个元素被自动初始化为预类型的默认值
对于一维数组,要设置显式初始值,可以在 数组创建表达式 之后加上 初始化列表,eg:

int[] intArr = new int[] {10,20,30,40};
// 一维数组

对于矩形数组的显式初始化,与一维数组类似,eg:

int[,] intArray2 = new int[,] {{10, 1}, {2, 10}};
1.1.1.1 快捷语法
int[] arr1 = new int[3] {10,20,30};
int[] arr1 = {10,20,30};
// 以上二者等价

int[,] arr = new int[2,3] {{0,1,2},{10,11,12}};
int[,] arr = {{0,1,2},{10,11,12}};
// 以上二者等价
1.1.1.2 隐式类型数组

当初始化数组时,可以让编译器工具初始化语句的类型来推断数组类型,但仍需在初始化提供秩说明符。eg:

int[] intArr1 = new int[] {10,20,30,40}; // 显式
var intArr2 = new [] {10,20,30,40}; // 隐式

int[,] intArr3 = new int[,] {{10,1},{2,10},{11,9}}; // 显式
var intArr4 = new [,] {{10,1},{2,10},{11,9}}; // 隐式

1.2 交错数组

与矩形数组不同,交错数组的 子数组的元素个数 可以不同,而矩形数组是:某个维度的所有子数组有相同长度的多维数组

1.2.1 声明交错数组

交错数组的声明语法要求 每个维度都要有一对独立的方括号,此外不能在声明语句中初始化 顶层数组之外的数组。eg:

int[][] jagArr = new int[3][];

int[][] jagArr = new int[3][4]; // 编译错误,不能在声明语句中初始化顶层数组之外的数组

1.2.2 实例化交错数组

交错数组的完全初始化不能在一个步骤中完成,由于及交错数组时独立数组的数组,所以每个数组必须独立创建

// 交错数组的子数组是 一维数组
int[][] Arr = new int[3][]; // 实例化顶层数组

Arr[0] = new int[] {10,20,30};
Arr[1] = new int[] {40,50,60,70};
Arr[2] = new int[] {80,90,100,110,120};

// 交错数组的子数组是 二维数组

int[][,] Arr = new int[3][,]; // 实例话带有3个二维数组的交错数组

Arr[0] = new int[,] {{10,20}, {100,200}};
Arr[1] = new int[,] {{30,40,50}, {60,70,80}};

1.3 foreach 语句

foreach 语法:

// 显示
foreach (Type Identifier in ArrayName)
    Statement

// 隐式
foreach (var Identifier in ArrayName)
    Statement

其中 Identifier 是迭代变量,这值是只读,不能修改的,在值类型数组中,改变它会报错,而在引用类型中修改它,则会同时改变原数组。

  • 对于矩形数组,元素的处理次序是最右的索引号最先递增直至所有元素。
  • 对于交错数组,就必须为交错数组中的 每一个维度使用独立的 foreach 语句

1.4 数组协变

在某些情况下,即使某个对象不是数组的基类型,我们也可以摆它赋值给数组元素,这属性叫做 数组协变,下面情况下可以使用数组协变

  • 数组时引用类型数组(因此基类型数组没有协变)
  • 在赋值的对象类型和数组基类类型之间有隐式转换或显示转换(比如基类和派生类)

1.5 数组继承的有用成员

C#数组是从 System.Array 类继承,它从基类继承很多有用的属性和方法,eg:

  • Rank:类型是属性,生存期是实例,用于获取数组的维度数
  • Length:类型是属性,生存期是实例,用于获取数组的所有维度的元素总和
  • GetLength:类型是方法,生存期是实例,用于获取数组的指定维度的长度
  • Clear:类型是方法,生存期是静态,用于将某一范围内的元素设置为 0 或 null
  • Sort:类型是方法,生存期是静态,用于对数组进行排序
  • BinarySearch:类型是方法,生存期是静态,用于搜索一维数组中的值
  • Clone:类型是方法,生存期是静态,用于数组的浅复制
  • IndexOf:类型是方法,生存期是静态,用于返回一维数组中遇到的第一个值
  • Reverse:类型是方法,生存期是静态,用于反转数组
  • GetUpperBound:类型是方法,生存期是实例,用于获取指定维度的上限

1.5.1 Clone 方法

Clone 方法为数组进行浅复制,只创建数组本身的克隆,如果是引用类型数组,它不会复制元素引用的对象

  • 克隆值类型数组会产生两个独立数组
  • 克隆引用类型数组会产生指向相同对象的两个数组,修改一组数组后,另一个数组会同时改变

2 List<T> 泛型数组

使用泛型数组可以获得类型安全的直接优点,而 不需从基集合类型中派生并实现类型特定的成员,此外如果集合元素为 值类型,泛型集合类型的性能也会更好,因为无需装箱。

List<T> 泛型集合表示可通过索引访问的对象的强类型列表,它为与 System.Collections.Generic 命名控件下。

2.1 List<T> 的常用属性及方法

  • Add:方法,返回值 void,参数 T item,作用时将对象添加到 List<T> 的结尾处,对于引用类型,添加对象可以为 null
  • ToArray:方法,用于将 List<T> 的元素赋值到新数组中(不是泛型集合,而是数组,理清概念)
  • Count:属性,如同数组中的 Length
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值