CSharpDotNetTech 中的数组基础






3.94/5 (47投票s)
本文通过易于理解的图形示例解释了 C# 中数组的类型。
介绍
数组是相同类型变量的集合,可以使用数字索引访问。数字索引写在数组名后的方括号中。
目录
- Characteristics
- 一维数组
- 遍历一维数组
- 二维数组
- 三维数组...
- 多维数组的边界
- 交错数组
- 混合数组
以下是一维数组的声明
int[ ] roll = new int[8];
Characteristics
数字索引是从零开始的。它从 0 到 n-1,其中 n 是数组的大小(数组中的元素总数)。
声明时,数值类型数组的默认值设置为 0,引用类型的默认值设置为 null
。
数组存储在连续的内存位置,如图所示。
在 C# 中,数组是对象,它们具有某些属性,如 Length
,可以通过使用 (.
) 和属性名来访问。所有数组都派生自 abstract
类数组,因此可以调用许多内置方法。
//Rank propety Return number of dimensions
int[ ] single = new int[4] { 1, 2, 3, 4 };
int dimension = single.Rank;
一维数组
它是一维数组最简单的形式,可以看作是一行 n 列,其中每列都通过零基索引访问。上面的两个代码示例显示了一维数组。
在 C# 中,数组的声明与 C 或 C++ 有点不同。这里方括号放在类型名称之后,然后是数组名、关键字 new,然后是类型和方括号,其中包含数组的大小。
Type[ ] arrayname = new Type[size];
以下代码初始化了一个大小为 5 的一维整数数组。它包含 5 个元素,可以通过 arr[0]
到 arr[4]
访问。
//Integer Array declaration
int[ ] arr = new int[5];
字符类型数组的声明如下
//Character type array
char[ ] name = new char[10];
同样,string
类型数组的声明如下
//String array declaration
string[ ] days = new string[7];
有许多方法可以为数组赋值。数组可以在声明行中通过将值放在花括号 { } 中并用逗号分隔来初始化。字符放在单引号中,string
s 放在双引号中。
//Integer Array Initialization
int[ ] arr = new int[5] { 1, 2, 3, 4, 5 };
//Character Array Initialization
char[ ] name = new char[10] { 'i', ' ', 'a', 'm', ' ', 'f', 'i', 'n', 'e', '.' };
//String Array Initialization
string[ ] days = new string[7] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
初始化数组时,可以省略数组的大小。然后数组的大小将通过花括号中写入的元素数量计算得出。
声明、初始化数组的另一种方法是
//Integer Array Declaration, Initialization
int[ ] arr;arr = new int[5] { 1, 2, 3, 4, 5 };
以下为数组赋值的方式会导致错误。
//Wrong way of writing
int[ ] arr = new int[5];
arr = { 1, 2, 3, 4, 5 };
遍历一维数组
由于在 C# 中,数组是对象并且它们保留某些内置属性。Length
属性返回数组中的元素总数。目前我们处理的是一维数组,因此元素总数等于数组的大小。
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(i);
}Console.ReadLine();
多维数组
二维数组
数组可以是多维的。最常用的是二维数组,通常矩阵形成二维数组。在二维数组中,使用两个零基索引来访问数组中的特定值。
//Integer 2D Array
int[,] matrix = new int[10, 10];
//Accessing Value
int val = matrix[5, 7];
存储在第 5 行、第 7 列的元素值(即 58)将分配给变量 val
。行和列具有零基索引。二维数组可以存储的总值等于行数和列数的乘积。对于上面的情况,它是 100。
一维数组是单行,列数 >0。二维数组有多行,因此形成一个表格。
访问存储在 balances 表中的第 3 行、第 4 列的元素。
要初始化二维数组,每行的值都放在花括号中,就像一维数组一样,然后将所有行的这些花括号集放在另一组花括号中,方式相同。
//2D Array Initializtion
int[,] arr_2d = new int[3, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
//Initializing 2Dimensional Array
char[,] day = new char[2, 3] { { 'o', 'n', 'e' }, { 't', 'w', 'o' } };
在上面的代码段中,有 3 行、2 列,因此元素总数为 2 x 3 = 6。要初始化第一个图所示的二维数组,该数组有 10 行 10 列,这很困难。可以使用循环为每个位置分配值。
//Assigning Values to matrix[10,10] array
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
matrix[i, j] = i * 10 + j + 1;
}
}
对于多维数组,了解维数有时对于更全面地掌握数组非常重要。Rank 属性返回数组的维数。
//Getting Number of dimensions of array
int dim = matrix.Rank;
GetUpperBound
函数返回数组在特定维度的上界。
for (int i = 0; i <= matrix.GetUpperBound(0);i++)
{
for (int j = 0; j <= matrix.GetUpperBound(1); j++)
{
Console.Write(matrix[i, j].ToString() + "\t");
}
Console.WriteLine();
}
上述代码段的输出如下
GetLowerBound
方法获取数组在特定维度的下界。下图显示了长度、上界和下界之间的区别。
三维数组
数组也可以有超过两个维度。对于三维数组,我们需要三个索引来访问数组中的每个元素。三维数组的例子可以是一个空间中的点。考虑一堆小砖块,如下图所示,要寻址每个小砖块,需要一个索引用于行,一个用于列,一个用于深度。
//Block code 3D array
int[, ,] block_3d = new int[2, 3, 4];
四维数组
四维数组的例子可以是一周中的一秒,一分钟有 60 秒,一小时有 60 分钟,一天有 24 小时,一周有 7 天。
//Week 4D array
int[, , ,] week = new int[7, 24, 60, 60];
交错数组
数组的数组称为交错数组。
这句话可能令人困惑,但请考虑保存学习不同科目数量的学生分数的例子。
Student-1 marks 65, 60, 76
Student-2 marks 78, 92, 68, 90, 55
Student-3 marks 45, 59, 88, 72
如果使用二维数组来存储上述分数,则需要一个 3 行 5 列的数组。对于不存在分数的相应位置,需要添加额外的信息。
65 |
60 |
76 |
0 |
0 |
78 |
92 |
68 |
90 |
55 |
45 |
53 |
88 |
72 |
0 |
在这种情况下,交错数组非常有用。交错数组可能具有不同的尺寸和维度。对于这种情况,我们需要一个具有三个元素的一维数组,并且每个元素都是一个长度分别为 3、5、4 的一维数组。
//Jagged arrays
int[ ][ ] student = new int[3][ ];
在上面的代码段中,使用了两对方括号。现在,必须将交错数组的每个元素分配给一个一维数组。
//Declaring Each Element of Jagged Array
student[0] = new int[3];
student[1] = new int[5];
student[2] = new int[4];
值也可以通过放在方括号之后来分配,就像一维数组一样。
//Initializing Each Element of Jagged Array
student[0] = new int[3] { 65, 60, 76 };
student[1] = new int[5] { 78, 92, 68, 90, 55 };
student[2] = new int[4] { 45, 59, 88, 72 };
这样做的一个简便方法是
//Jagged arrays
int[ ][ ] student = new int[3][ ]
{new int[3] { 65, 60, 76 },new int[5] { 78, 92, 68, 90, 55 },
new int[4] { 45, 59, 88, 72 }};
交错数组是引用类型,因此它们被初始化为 null
。要在 student
示例中的交错数组中访问元素,需要使用两个索引。
//Accessing elements in Jagged Array
student[2][2] = 80;for (int i = 0; i < student.Length; i++)
{
for (int j = 0; j < student[i].Length; j++)
{
Console.Write(student[i][j]);
Console.Write('\t');
}
Console.WriteLine();
}
混合数组
交错数组和多维数组的组合称为混合数组。在大小不同的多维数组的情况下,使用混合数组。考虑有三个表,每个表都有不同数量的行和列。
Table-1 3 rows, 5 columns
Table-2 4 rows, 3 columns
Table-2 6 rows, 4 columns
//Mixed Arrays int [ ][,]mixed=new int[3][ ]
{
new int[3,5],
new int[4,3],
new int[6,4]
};
祝您一切愉快。