首先需要明确一个概念:在 C# 中,数组([])和 Array 是两个不同的东西,Array 是一个抽象类,而数组则是由 Array 派生出来的引用类型。
当然,通常将数组理解为 Array 也没太大问题,因为数组是可以使用 Array 的属性和方法的。
初始化
数组的初始化有以下三种方式:
1、以数组类型的默认值对数组元素进行初始化
int[] intArray = new int[3]; // 0 0 0
string[] strArray = new string[3]; // null null null
bool[] boolArray = new bool[3]; // False False False (打印的时候,bool值类型转为string类型,会自动大写首字母)
ps
默认值:值类型:0,引用类型:null,bool值:false
2、声明数组的时候进对数组元素行初始化
int[] intArray1 = new int[3] {1, 2, 3}; // 1 2 3
// 简略写法一:可以省略长度说明符,因为可以根据初始化列表中的元素数量推断出数组的长度
int[] intArray2 = new int[] {4, 5, 6}; // 4 5 6
// 简略写法二:可以省略 new 表达式和数组类型(这种写法称为"隐式类型化数组")
int[] intArray3 = {7, 8, 9}; // 7 8 9
3、先声明数组,再使用 new 进行初始化
int[] intArray;
intArray = new int[] {1, 2, 3}; // 1 2 3
// intArray = {1, 2, 3}; // Error,使用这种方式进行初始化,必须使用 new 运算符向此变量分配新数组
特性
1、数组中元素的类型必须是相同的
int[] intArray = new int[] {1, 2, 3}; // 1 2 3
// string[] strArray = new string[] {"a", 1, "b"}; // Error
ps
- 数组元素可以是任意类型,但一个数组中的所有元素都必须是数组声明时所指定的类型;
- 如果希望数组存储任意类型的元素,可将其类型指定为 object。在 C# 的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Object 继承的。
object[] objArray = new object[] {1, "a", true}; // 1 a True
2、数组长度固定,且初始化的时候必须指定长度
可以从上面的初始化方式看到,无论使用哪种方式进行初始化,编译器都可以获取到数组的长度。
由于数组的长度是固定的,所以数组并没有增删操作,但是可以进行改查。
修改数组中元素的值:
int[] intArray = new int[] {1, 2, 3};
intArray[0] = 666;
intArray[1] = 888;
intArray[2] = 999;
foreach (int i in intArray)
{
Console.Write(i + " ");
}
// 666 888 999
3、数组元素在内存(托管堆)上的存储是连续的
因为数组元素在内存中是连续的,所以可以使用下标(从0开始,长度为n的数组,下标为0~n-1)直接访问,改查速度非常快。
4、数组可以作为参数(实参)传递给方法形参
由于数组是引用类型,因此方法可以更改数组元素的值:
string[] strArray = new string[] {"Hello", "World"}; // Hello World
changeElement(strArray, 1, "fightsyj");
void changeElement(string[] arr, int idx, string newValue)
{
arr[idx] = newValue;
}
foreach (string str in strArray)
{
Console.Write(str + " ");
}
// Hello fightsyj
多维数组
二维数组
int[,] array2D = new int[,] {
{ 1, 2 },
{ 3, 4 },
{ 5, 6 },
{ 7, 8 }
}; // 1 2 3 4 5 6 7 8
array2D[0, 1] = 666;
array2D[1, 0] = 888;
array2D[3, 1] = 999;
foreach (int i in array2D)
{
Console.Write(i + " ");
}
// 1 666 888 4 5 6 7 999
三维数组
int[,,] array3D = new int[,,] {
{
{ 1, 2, 3 },
{ 4, 5, 6 }
},
{
{ 7, 8, 9 },
{ 10, 11, 12 }
}
}; // 1 2 3 4 5 6 7 8 9 10 11 12
array3D[0, 0, 1] = 666;
array3D[0, 1, 0] = 888;
array3D[1, 1, 2] = 999;
foreach (int i in array3D)
{
Console.Write(i + " ");
}
// 1 666 3 888 5 6 7 8 9 10 11 999
交错数组
交错数组是元素为数组的数组,交错数组元素的维度和大小可以不同。
可以简单理解为多为数组的形状必定是规则的,而交错数组的形状不一定是规则的:
交错数组中元素个数不一致的那一维度在声明的时候不能指定长度!
int[][] jaggedArray = new int[][] { // 这里可以可以使用 [][] 或者 [4][],由于第二维数组的元素个数不一致,所以第二个 [] 必须是空的
new int[] {1, 2},
new int[] {3, 4, 5},
new int[] {6},
new int[] {7, 8}
}; // 1 2 3 4 5 6 7 8
jaggedArray[0][1] = 666;
jaggedArray[1][2] = 888;
jaggedArray[3][1] = 999;
for (int i = 0; i < jaggedArray.Length; i++)
{
for (int j = 0; j < jaggedArray[i].Length; j++)
{
Console.Write(jaggedArray[i][j] + " ");
}
}
// 1 666 3 4 888 6 7 999
Array中常用的属性和方法
属性
Length:获取 Array 的所有维度中的元素总数
Rank:获取 Array 的秩(维数)。 例如,一维数组返回 1,二维数组返回 2,依次类推
int[] intArray = new int[] {1, 2, 3};
string[,] strArray = new string[,] {
{"a", "b", "c"},
{"d", "e", "f"}
};
Console.WriteLine("intArray: Length = {0} Rank = {1}", intArray.Length, intArray.Rank); // intArray: Length = 3 Rank = 1
Console.WriteLine("strArray: Length = {0} Rank = {1}", strArray.Length, strArray.Rank); // strArray: Length = 6 Rank = 2
方法
SetValue(Object, Int32):将值设置为一维 Array 中指定位置的元素。 索引指定为 32 位整数。
GetValue(Int32):获取一维 Array 中指定位置的值。 索引指定为 32 位整数。
IndexOf(Array, Object):在一个一维数组中搜索指定对象,并返回其首个匹配项的索引。
Reverse(Array):反转整个一维 Array 中元素的顺序。
int[] intArray = new int[] {1, 2, 3};
intArray.SetValue(666, 0); // 666 2 3
Console.WriteLine("下标为0的值为:{0}", intArray.GetValue(0)); // 下标为0的值为:666
Console.WriteLine("值为2的下标为:{0}", Array.IndexOf(intArray, 2)); // 值为2的下标为:1
Array.Reverse(intArray); // 3 2 666
Sort(Array):使用 Array 中每个元素的 IComparable 实现,对整个一维 Array 中的元素进行排序。
- Array.Sort() 默认升序;
- Array.Sort() 仅支持一维数组;
- Array.Sort() 方法会直接修改原数组。
int[] intArray = new int[] {33, 55, 22, 11, 44};
Array.Sort(intArray); // 11 22 33 44 55
参考: