一、数组
1.1 数组初始化
当需要存储多个相同类型的元素时,C# 数组是一种非常常用的数据结构。数组是一种固定长度的数据结构,它由连续的内存单元组成,每个内存单元存储一个元素。
静态初始化:指定数组元素的初始值。
// elementType[] arrayName;
// elementType 是数组中元素的类型,arrayName 是数组的名称
int[] myArray;
动态初始化:指定数组的长度,然后为每个元素分配空间。
// elementType[] arrayName = new elementType[length];
int[] myArray = new int[3];
注意:在指定了数组的大小后,如果不复制数组中的所有元素,就不能重新设置数组的大小。如果事先不知道数组中包含多少个元素,就可以使用集合。
int[] myArray = new int[4];
int[] myArray = new int[4] {4, 5, 6, 7}; // 数组初始化器只能在声明数组变量时使用,不能在声明数组之后使用。
int[] myArray = new int[] {4, 5, 6, 7}; // 如果用花括号初始化数组,则还可以不指定数组的大小,因为编译器会自动统计元素的个数。
int[] myArray = {4, 5, 6, 7}; // 更简便的声明方式。
1.2 访问数组元素
通过索引器传递元素编号,就可以访问数组。索引器总是以0开头,表示第一个元素。可以传递给索引器的最大值是元素个数减1,因为索引从0开始。
int[] array = new[] { 4, 5, 6, 7 };
int v1 = array[0]; // 4
int v2 = array[1]; // 5
array[3] = 44; // { 4, 5, 6, 44 }
1.3 遍历数组
int[] myArray = { 1, 2, 3, 4, 5 };
for (int i = 0; i < myArray.Length; i++)
{
Console.WriteLine("index:"+ i +"value:"+ myArray[i]);
}
1.4 使用引用类型
引用类型后面会详细讲解,目前就走个流程,让大家知道数组可以存储引用类型。
using System;
namespace UserDefinedException
{
class TestTemperature
{
static void Main(string[] args)
{
Person[] myPersons = new Person[2];
myPersons[0] = new Person("刘","备");
myPersons[1] = new Person("曹", "操");
Console.WriteLine(myPersons[0].ToString());
Console.WriteLine(myPersons[1].ToString());
}
}
}
public class Person
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; }
public string LastName { get; }
public override string ToString() => $"{FirstName} {LastName}";
}
但是必须注意,如果数组中的元素是引用类型,就必须为每个数组元素分配内存。如果使用了数组中未分配内存的元素,则会抛出 NullReferenceException 类型的异常。
二、多维数组
int[,] twoDim = new int[3, 3]; // 二维数组
twoDim[0, 0] = 1;
twoDim[0, 1] = 2;
twoDim[0, 2] = 3;
twoDim[1, 0] = 4;
twoDim[1, 1] = 5;
twoDim[1, 2] = 6;
twoDim[2, 0] = 7;
twoDim[2, 1] = 8;
twoDim[2, 2] = 9;
注意:声明数组后,就不能修改其阶数了。
int[,] twoDim = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; // 如果事先知道元素的值,就可以使用数组索引器来初始化多维数组。
注意:使用数组初始化器时,必须初始化数组的每个元素,不能把某些值的初始化放在以后完成。
三、锯齿数组
int[][] jagged = new int[3][];
jagged[0] = new int[2] { 1, 2 };
jagged[1] = new int[6] { 1, 2, 3, 4, 5, 6 };
jagged[2] = new int[3] { 1, 2, 3 };
for (int row = 0; row < jagged.Length; row++)
{
for (int element = 0; element < jagged[row].Length; element++)
{
Console.WriteLine($"row: {row},element: {element}, value: {jagged[row][element]}");
}
}
/*
row: 0,element: 0, value: 1
row: 0,element: 1, value: 2
row: 1,element: 0, value: 1
row: 1,element: 1, value: 2
row: 1,element: 2, value: 3
row: 1,element: 3, value: 4
row: 1,element: 4, value: 5
row: 1,element: 5, value: 6
row: 2,element: 0, value: 1
row: 2,element: 1, value: 2
row: 2,element: 2, value: 3
*/