C#声明和使用数组、遍历数组、复制数组、多维数组、交错数组

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44800780/article/details/102699926

声明和创建数组

声明数组方式如下:

int [] pins;

数组元素并非只能是基元数据类型,还可以是结构、枚举或类.
比如,以下代码创建由Time结构构成的数组.

Time[] times;

创建数组实例

无论元素是什么类型,数组始终都是引用类型.
声明数组变量时不需要指定大小,也不会分配内存(仅仅在栈上分配一小块用于存储引用的内存).创建数组实例时才分配内存,数组大小也在这时指定.

pins = new int[4];

上面用new关键字创建数组实例,会使用默认值对其元素进行初始化。

在这里插入图片描述


填充和使用数组

创建数组实例时,所有元素都被初始化为默认值.例如,所有数值初始化为0,对象初始化为Null。可以修改这个行为:

int[] pins = new int[4]{1,2,3,4};

大括号中的值不一定是常量,也可以是运行时计算的值.
注意:大括号中的值的数量必须和要创建的数组实例的大小完全匹配:

初始化数组变量时可以省略new表达式和数组大小。让编译器根据初始值的数量计算大小:

int [] pins = {1,2,3,4};



创建隐式类型的数组

可让C#编译器自己推断数组元素的类型,如下所示:

var names = new[]{"Jack","tom","Bob","Nancy"};

在这个例子中,C#编译器推断names是string类型的数组变量.
注意:本例中的names变量被直接声明为var,而不是var[].
其次,必须在初始值列表之前添加new[].

使用这种语法,必须保证所有初始值都有相同的类型.


访问单独的数组元素

必须通过索引来访问单独的数组元素.

int mypin;
mypin = pins[1];
mypin = 1;
pins[2] = mypin;



遍历数组

所有的数组都是System.Array类的实例
在这里插入图片描述
该类定义了许多有用的属性和方法。比如Length属性,下面用Length遍历整个数组,将数组的各个元素的值输出到控制台.

int [] pins = {1,2,3,4};
for (int index = 0; index < pins.Length; index++)
{
	Console.WriteLine(pins[index]);
}

还可以使用foreach语句来遍历数组的所有元素.

int [] pins = {1,2,3,4};
foreach (int pin in pins)
{
	Console.WriteLine(pin);
}

foreach语句声明了一个循环变量(本例是int pin)来自动获取数组中每个元素的值.该变量的类型必须与数组元素类型匹配.
可将循环遍历声明为var,让C#编译器根据数组元素的类型来推断变量的类型.
比如

int [] pins = {1,2,3,4};
foreach (var pin in pins)
{
	Console.WriteLine(pin);
}

数组作为方法参数和返回值传递

方法可获取数组类型的参数,也可以把它们作为返回值传递。

public void ProcessData(int[] data)
{
	foreach (int i in data)
	{
		...
	}
}

记住数组是引用类型,在方法内部修改作为参数传递的数组,所有数组引用都会被修改,包括原始实参.

        static public int[] ReadData()
        {
            Console.WriteLine("How many elements?");
            string reply = Console.ReadLine();
            int num = int.Parse(reply);
            int[] data = new int[num];
            return data;
        }   

在这里插入图片描述

复制数组

数组是引用类型,复制数组变量之后,得到对同一个数组实例的两个引用.

int [] pins = {1,2,3,4};
int[] temp = pins;

修改pins[1]的值,temp也会随之改变。要完全复制数组实例,获得堆上实际数组的拷贝。要做两件事情,首先创建类型和大小与原始数组一样的新数组实例,然后将数据元素从原始数组逐个复制到新数组:

int []pins ={1,2,3,4};
int []copy = new int[pins.Length];
for(int i = 0; i < copy.Length; i++)
{
	copy[i] = pins[i];
}

更简洁的方法是使用CopyTo方法将一个数组的内容复制到另一个数组.
比如:

int []pins = {1,2,3,4};
int copy = new int[pins.Length];
pins.CopyTo(copy,0);

上面的例子从索引0开始将pins数组的所有元素复制到copy数组.
还可以使用静态方法Array.Copy:

int []pins = {1,2,3,4};
int copy = new int[pins.Length];
Array.Copy(pins, copy, copy.Length);

需要指定复制的数组,复制到哪一个数组,以及复制的长度.

还有一个方法是Clone

int[] pins = {1,2,3,4};
int[] copy = (int[])pins.Clone();



多维数组

int[,] items = new int[9,9];

上面创建了一个81个整数的二维数组items,可以将二维数组想象成表格,第一维是表行,第二维是列.

int[,] items = new int[4,6];

访问二维数组元素需要提供两个索引值来指定目标元素的"单元格"

items[2,3] = 99;
items[2,4]++;

创建交错数组

在c#中,普通多维数组有时也称为矩形数组。
下面这个表格是二维数组每一行都包含40个元素,共160个元素.

int[,] items = new int[4,40];

多维数组可能消耗大量内存,可以考虑使用交错数组,其每一列的长度都可以不同,如下面所示:

int[][]items = new int[4][];
int[] columnForRow0 = new int[3];
int[] columnForRow1 = new int[10];
int[] columnForRow2 = new int[40];
int[] columnForRow3 = new int[25];
items[0] = columnForRow0;
items[1] = columnForRow1;
items[2] = columnForRow2;
items[3] = columnForRow3;

本列第一个3个元素,第二列10个元素,第三列40个元素,最后一列25个元素.

猜你喜欢

转载自blog.csdn.net/qq_44800780/article/details/102699926