数组可以说是在任何语言中都非常基本的数据结构了。这篇笔记以C#中的数组为引,再延伸到C#的几种集合类(Collections)以及一些相关的基本概念。
数组 Array
概述
数组存储相同种类的元素,其大小固定,且是顺序存储的,即在内存中占据一段连续的地址。
数组作为一种引用类型(其基类是System.Array),需要用new来创建实例。
//初始化时指定大小
double[] balance = new double[10];
//可以直接赋值来初始化
int[] marks = {99, 98, 92, 97, 95};
初始化而尚未赋值的数组,编译器会根据其类型隐式地将所有元素设置为默认值。
数组最大的特点还是能够用下标索引来随机访问其中的元素:
double salary = balance[9];
//以下是C# 8.0引入的好东西!
//末尾运算符 ^
//[^n]表示[length-n],类似Python用负数索引[-n]表示[length-n]
double salary = balance[^1];
//范围运算符 ..
//[a..b]表示从[a]到[b]的范围(但不包含[b]!),类似Python的切片[a:b]
//省略a代表0,省略b代表^0
double[] salaries1 = balance[..^3];
//如果a比b还大,会抛出异常(Python中则是返回空列表)
double[] salaries2 = balance[3..2]; //ArgumentOutOfRangeException
//a和b一样大时,返回长度为0的集合
double[] salaries3 = balance[3..3];
Console.WriteLine(salaries3.Length); //0
由于实现了IEnumerable接口,数组可以使用foreach...in...的方式进行迭代访问,还可以使用LINQ,这样就无需获取数组长度再用for循环迭代了。关于这个接口及其相关的内容,我在本文稍后的部分记述。