65.9K
CodeProject 正在变化。 阅读更多。
Home

CSharpDotNetTech 中的数组基础

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.94/5 (47投票s)

2011年2月24日

CPOL

5分钟阅读

viewsIcon

307537

本文通过易于理解的图形示例解释了 C# 中数组的类型。

 

介绍 

数组是相同类型变量的集合,可以使用数字索引访问。数字索引写在数组名后的方括号中。

 

目录

  • Characteristics
  • 一维数组
  • 遍历一维数组
  • 二维数组
  • 三维数组...
  • 多维数组的边界
  • 交错数组
  • 混合数组

 

以下是一维数组的声明

int[ ] roll = new int[8];  

Arrays-dontumindit/roll.png

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];

Arrays-dontumindit/NAME.jpg

同样,string 类型数组的声明如下

//String array declaration
string[ ] days = new string[7];

Arrays-dontumindit/DAYS.jpg

有许多方法可以为数组赋值。数组可以在声明行中通过将值放在花括号 { } 中并用逗号分隔来初始化。字符放在单引号中,strings 放在双引号中。

//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();

Arrays-dontumindit/array4.gif

多维数组 

二维数组

数组可以是多维的。最常用的是二维数组,通常矩阵形成二维数组。在二维数组中,使用两个零基索引来访问数组中的特定值。

//Integer 2D Array
int[,] matrix = new int[10, 10];
//Accessing Value
int val = matrix[5, 7];

Arrays-dontumindit/array5.gif

存储在第 5 行、第 7 列的元素值(即 58)将分配给变量 val。行和列具有零基索引。二维数组可以存储的总值等于行数和列数的乘积。对于上面的情况,它是 100。

一维数组是单行,列数 >0。二维数组有多行,因此形成一个表格。

Arrays-dontumindit/array6.gif

访问存储在 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();
}

上述代码段的输出如下

Arrays-dontumindit/array7.gif

GetLowerBound 方法获取数组在特定维度的下界。下图显示了长度、上界和下界之间的区别。

Arrays-dontumindit/array8.gif

三维数组 


数组也可以有超过两个维度。对于三维数组,我们需要三个索引来访问数组中的每个元素。三维数组的例子可以是一个空间中的点。考虑一堆小砖块,如下图所示,要寻址每个小砖块,需要一个索引用于行,一个用于列,一个用于深度。

Arrays-dontumindit/array9.gif

//Block code 3D array
int[, ,] block_3d = new int[2, 3, 4];


四维数组


四维数组的例子可以是一周中的一秒,一分钟有 60 秒,一小时有 60 分钟,一天有 24 小时,一周有 7 天。

Arrays-dontumindit/array10.gif

//Week 4D array
int[, , ,] week = new int[7, 24, 60, 60];



Arrays-dontumindit/array11.gif

交错数组 

数组的数组称为交错数组。

Arrays-dontumindit/array12.gif

这句话可能令人困惑,但请考虑保存学习不同科目数量的学生分数的例子。

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();
}

Arrays-dontumindit/array13.gif

混合数组

交错数组和多维数组的组合称为混合数组。在大小不同的多维数组的情况下,使用混合数组。考虑有三个表,每个表都有不同数量的行和列。

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]
 };

祝您一切愉快。 

© . All rights reserved.