C# 数组(Array)

变量用于存储字面量值,而数组用于存储多个字面量值。

数组是一种数据结构,它存储相同数据类型的固定数量的文本值(元素)。数组元素连续地存储在内存中。

在C#中,数组可以为三种类型:一维数组,多维数组 和 锯齿数组。在这里,您将了解一维数组。

下图说明了数组表示形式。

数组表示

数组声明和初始化

可以使用方括号指定数组的元素类型来声明数组。

int[] evenNums;  // 整数数组

string[] cities; // 字符串数组

以下语句在单个语句中声明并将值添加到数组中。

int[] evenNums = new int[5]{ 2, 4, 6, 8, 10 }; 

string[] cities = new string[3]{ "Mumbai", "London", "New York" };

在上面,evenNums 数组最多可以存储五个整数。new int[5] 方括号中的数字 5 是指定数组的大小。同样,cities 数组的大小为3。数组元素被添加到大括号 {} 中以逗号分隔的列表中。

数组类型变量可以使用 var 声明,而没有方括号 []。

var evenNums = new int[]{ 2, 4, 6, 8, 10}; 

var cities = new string[]{ "Mumbai", "London", "New York" };

如果要在声明时添加数组元素,则 size 是可选的。编译器将根据花括号内的元素数量推断其大小,如下所示。

int[] evenNums = { 2, 4, 6, 8, 10}; 

string[] cities = { "Mumbai", "London", "New York" }

下面的示例演示无效的数组声明。

//必须指定大小 
int[] evenNums = new int[]; 

//元素数必须等于指定的大小 
int[] evenNums = new int[5] { 2, 4 };

//不能将var与数组初始化程序一起使用
var evenNums = { 2, 4, 6, 8, 10};

延迟初始化

不必在单个语句中声明和初始化数组。您可以先声明一个数组,然后再使用 new 运算符对其进行初始化。

int[] evenNums;

evenNums = new int[5];

// 或

evenNums = new int[]{ 2, 4, 6, 8, 10 };

访问数组元素

可以使用索引访问数组元素。索引是与每个数组元素关联的数字,从索引 0 开始 到 数组大小-1 结束。

以下示例使用索引添加/更新和检索数组元素。

int[] evenNums = new int[5];
evenNums[0] = 2;
evenNums[1] = 4;
//evenNums[6] = 12;  //抛出运行时异常IndexOutOfRange

Console.WriteLine(evenNums[0]);  //输出 2
Console.WriteLine(evenNums[1]);  //输出 4

请注意,尝试添加超出其指定大小的元素会抛出 IndexOutOfRangeException 异常。

使用for循环访问数组

使用for循环访问数组元素。在for循环的条件表达式中使用数组的 length 属性。

int[] evenNums = { 2, 4, 6, 8, 10 };

for(int i = 0; i < evenNums.Length; i++){
    Console.WriteLine(evenNums[i]);  
}

for(int i = 0; i < evenNums.Length; i++){
    evenNums[i] = evenNums[i] + 10;  // 将每个元素的值更新10
}

使用 foreach 循环访问数组

使用foreach循环读取数组元素的值而不使用索引。

int[] evenNums = { 2, 4, 6, 8, 10}; 
string[] cities = { "Mumbai", "London", "New York" }; 

foreach(var item in evenNums){
    Console.WriteLine(item);   
}

foreach(var city in cities){
    Console.WriteLine(city);
}

LINQ方法

C#中的所有数组均派生自抽象基类 System.Array。

Array类实现了IEnumerable接口,这样你就可以LINQ扩展方法,如 Max(),Min(),Sum(),reverse()等。

int[] nums = new int[5]{ 10, 15, 16, 8, 6 };

nums.Max(); // 返回16
nums.Min(); // 返回6
nums.Sum(); // 返回55
nums.Average(); // 返回55

System.Array 类还包括用于创建,操作,搜索和数组排序的方法。

int[] nums = new int[5]{ 10, 15, 16, 8, 6 };

Array.Sort(nums); // 排序数组 
Array.Reverse(nums); // 排序数组 in descending order
Array.ForEach(nums, n => Console.WriteLine(n)); // 迭代数组
Array.BinarySearch(nums, 5);// 二进制搜索

将数组作为参数传递

可以将数组作为参数传递给方法参数。数组是引用类型,因此该方法可以更改数组元素的值。

public static void Main(){
    int[] nums = { 1, 2, 3, 4, 5 };

    UpdateArray(nums); 

    foreach(var item in nums)
        Console.WriteLine(item);   
}
                    
public static void UpdateArray(int[] arr)
{
    for(int i = 0; i < arr.Length; i++)
        arr[i] = arr[i] + 10;   
}

接下来了解 多维数组锯齿数组