C#数组 Array
数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。
声明数组变量并不是每一个元素单独进行声明,而是声明一个数组变量,然后使用下标来表示一个一个单独的变量。如数组变量numbers,它每一个元素是numbers[0]、numbers[1]、numbers[2]……,numbers[n].
数组声明
datatype[] arrayName;
datatype:用于指定被存储在数组中的元素的类型。
[]:指定数组的维度,其中可以指定数组元素的多少。
arrayName:指定数组的名称
数组初始化
声明一个数组不会在内存中初始化数组。当初始化数组变量时,可以进行赋值给到数组。
- 数组是一个引用类型,在需要使用时可以使用new关键字来创建数组实例。
如:int[] num = new int[10];
- 可以通过索引来赋值给一个单独的数组元素
int[] num = new int[10];
int[0] = 0;(注意:C#中数组的索引是从0开始的)
- 可以在声明数组的同时给数组进行赋值
int[] num = {0,1,2,3};
- 可以创建并初始化一个数组
int[] num = new int[4]{0,1,2,3};
在上面这种情况下也可以省略数组的大小,系统会根据初始化数组时的元素个数自动计算数组的大小。
- 可以把一个数组变量赋值给到另一个数组变量,这样目标数组与源数组会指向同一内存地址
int[] num = new int[]{0,1,2,3};
int[] numbers = num;
注意:当使用new关键字进行数组创建时,C#编译器会根据数组类型为数组中的每一个元素初始化默认值,比如int类型数组初始化时会初始化为0。
数组元素访问
数组中的元素是通过还索引的数组名来访问的。这是通过把索引放在数组名后的方括号中来实现。
如 int n = num[1];
使用visual studiou新增一个C#控制台应用程序Chapter08_001
在Main方法中添加如下代码:
//数组 声明、赋值、访问
//n是一个带10个整数的数组
int[] n = new int[10];
int i, j;
//初始化数组n中的元素
for (i = 0; i < 10; i++) {
//使用for循环遍历数组中每一个元素并对元素进行赋值
n[i] = i + 10;
}
//访问数组中的每一个元素,并在控制台打印输出
for (j = 0; j < 10; j++) {
Console.WriteLine("n[{0}] = {1}", j, n[j]);
}
Console.ReadKey();
编译运行后结果如下:
上面的代码体现了一个常规数组的声明、赋值、访问的过程
数组foreach循环
上面的代码使用了for循环对数组中的每一个元素进行了遍历,可以使用foreach来代替这种循环遍历
在Main方法中加入foreach循环模块:
//使用foreach循环遍历数组元素
Console.WriteLine("------------使用foreach循环遍历数组元素-------------");
int cnt = 0;
foreach (int k in n) {
Console.WriteLine("n[{0}] = {1}",cnt++,k);
}
编译运行后结果如下:
上面说了一些关于数组的最基本的操作,下面再介绍一些关于数组必须掌握的知识
多维数组
多维数组最简单的形式是二维数组,一个二维数组,在本质上,是一个一维数组的列表。
C#中的二维数组
数组中的每个元素是使用形式为arr[i,j]的元素名称来标识的。
arr:表示的是数组的名称
i,j:是维一标识arr中每个元素的下标
初始化二维数组
多维数组可以通过在括号内为每行指定值来进行初始化,比如下面的数组是一个三行四列的二维数组。
int [,] arr =int [3,4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
二维数组元素访问
二维数组中元素是通过使用下标(行索引和列索引一起)来访问的。如:
int num = arr[2,3]; //这里是把arr数组中的第三行第四列数据取出并赋值给到变量num
在Main方法中加入如下代码:
Console.WriteLine("-------------二维数据测试-------------");
//声明并初始化一个3行2列的二维数组
int[,] arr = new int[3, 2] { {1,2},{3,4},{5,6} };
int row, col;
//在控制台打印数组中的每一个元素
int rows = Convert.ToInt32(arr.GetLongLength(0));//注意:这里的维度从0开始计算
int cols = Convert.ToInt32(arr.GetLongLength(1));
for (row = 0; row < arr.GetLongLength(0); row++) {
for (col = 0; col < cols; col++) {
Console.WriteLine("arr[{0}][{1}] = {2}",row,col,arr[row,col]);
}
}
编译运行后结果如下:
交错数组
交错数组表示的是数组的数组。
比如:int [][] scores;
声明一个数组并不会在内存中创建数组,要创建数组可以如下
int[][] scores = new int[5][];
for(int i=0;i<scores.length;i++)
{
scores[i] = new int[4];
}
初始化一个交错数组可以如下进行:
int[][] scores = new int[2][]{new int[]{1,2,3},new int[]{4,5,6,7}};
上面这个交错数组表示:
scores是一个由两个整型数组组成的数组,其中scores[0],是一个带有3个整型的数组,scroes[1],是一个带有4个整数的数组。
C#中传递数组给方法
在C#中,可以传递数组作为函数的参数,也可以通过指定不还索引的数组名来给函数传递一个指向数组的指针。
参数数组
当声明一个方法时,如果不确定要传给方法作为参数的参数个数,可以使用参数数组,它通常是用来传递未知数量的参数给函数。
params参数
在使用数组作为形参时,C#提供了params关键字,使调用数组形参的方法时同,既可以传自递数组实参,也可以只传递一组数。
public 返回类型 方法名称(params 类型名称[] 数组名称)
在程序新建如下方法:
public static int AddElements(params int[] arr) {
int sum = 0;
foreach (int i in arr)
{
sum += i;
}
return sum;
}
在Main方法中对参数数组方法的调用可以使用如下两个方法进行:
Console.WriteLine("---------------参数数组调用-----------------");
int sum = AddElements(1, 2, 3, 4, 5);
Console.WriteLine("使用一组数来进行传递求和:{0}",sum);
int[] param = new int[] { 1, 2, 3, 4, 5 };
sum = AddElements(param);
Console.WriteLine("使用数组来进行传递求和:{0}", sum);
编译运行后结果如下:
C#中Array类
Array类是所有C#中数组的基类,它在System命名空间中定义。它提供了各种用于数组的属性和方法。
Array类常用属性:
IsFixedSize:获取一个值,这个值表示数组是否带有固定的大小
IsReadOnly:获取一个值,这个值指示数组是否只读
Length:获取一个32位整数,这个值表示所有维度的数组中的元素总数
LongLength:获取一个64位整数,表示所有维度的数组中元素总数
Rank:获取数组的秩(维度)
Array类中常用方法:
Clear:根据元素的类型,设置数组中某个范围的元素为零、为false或者null
Copy(Array,Array,Int32):从数组的第一个元素开始复制某个范围的元素到另一个数组的第一个元素位置,长度由后面的32位整数决定
CopyTo(Array,Int32):从当前的一维数组中复制出所有元素到一个指定的一维数组的指定索引位置,索引位置由后面的32位整数决定
GetLength:获取一个32位整数,表示指定维度的数组中的元素总数
GetLongLength:获取一个64位整数,这个值表示指定维度的数组中的元素总和
GetLowerBound:获取数组中指定维度的下界
GetType:获取当前实例的类型
GetUpperBound:获取数组中指定维度的上界
GetValue(Int32):获取一维数组中指定位置的值,索引由32位整数指定
IndexOf(Array,object):搜索指定的对象,返回整个一维数组中第一次出现的索引
Reverse(Array):反转整个一维数组中元素顺序
SetValue(Object,Int32):给一维数组中指定位置的元素设置值,索引由一个32位整数指定
Sort(Array):使用数组的每个元素的IComparable实现排序整个一维数组中的元素
ToString:返回一个表示当前对象的字符串