C# 常用数据结构之数组Array

首先需要明确一个概念:在 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

参考:

数组(C# 编程指南)

Array 类

C# 数组(Array)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fightsyj

您的鼓励将是我分享的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值