多维和交错数组
介绍
多维数组是一维数组的扩展形式,常用于存储数学计算、图像处理和记录管理的数据。例如,普通的棋盘有 8 行 8 列,可以使用大小为 8 x 8 的多维数组轻松表示(8 行,每行可存储 8 个元素)。本指南详细介绍了多维数组的变体及其在 C# 中的应用。
数组是线性形式的同类数据的集合,称为一维数组。换句话说,一维数组是一行相似的数据。
char[] one_d_array = {'A', 'B', 'C', 'D'};
一维数组只能存储一系列数据,例如
- 卷号系列
- 无线电信道频率系列
- 每日销售单位数
通常,您需要处理以矩阵或表形式存储的复杂数据:
- 图像的像素矩阵
- 计算机图形变换矩阵
- 图论中邻接矩阵,表示节点的连通性(Dijkstra邻接矩阵)
在上面的例子中,表中的每个数据行都可以映射到一维数组中。
矩阵中的数据也可以以类似的方式存储。
如上图所示,可以通过创建一个数组类型容器(数组的数组)来简化这一过程,该容器将保留其他一维数组(称为多维数组)的引用。
string[,] stuTable = new string[,]{
{ "Tom" , "35", "USA" },
{ "Sam" , "38", "Australia" },
{ "Henry", "40", "England" } };
要求:遵循深入研究数组基础指南,该指南彻底解释一维数组和相关概念。
多维数组
多维数组是一维数组的集合,可以表示关系表和矩阵。矩阵和表都可以看作是行的集合,可以映射到行数组(一维数组)。多维数组按行主序存储值,这意味着所有行的元素都以连续(一行接一行)的方式存储。多维数组的一个实际示例是商店每月每周每天售出的总单位数。
int[,] sales = new int[,]{
{10, 20, 12, 15, 15, 27, 35},
{9, 14, 17, 19, 10, 22, 39}
//... so on };
多维数组也称为矩形数组,因为每行的大小始终相同。以销售数组为例,其大小为7,任何更改大小的尝试都会导致错误。
多维声明和初始化
- 声明:多维数组以逗号分隔的语法声明以表示多维。
int [,] arr;
- 初始化:可以使用初始化语法在声明数组时提供值。
int [,] arrIni = {
{11, 2, 3},{14, 29, 37} };
- 有界初始化语法:多维数组的大小可以有界,这意味着只能提供定义数量的一维数组作为值。在此示例中,sales数组只能有两行条目。
int [,] arrBoundedIni = new int[2,3]{ // 2 is the number of rows and 3 is the size of each row
{11, 2, 3},
{14, 29, 37} };
初始化器和有界语法也可以组合成如下形式:
int [,] arrMixSyx = new int[2,3]{ // defined number of rows are 2
{11, 2, 3},
{14, 29, 37}
};
//or
int [,] arrMixSyx = new int[,]{
{11, 2, 3},
{14, 29, 37} };
您可以使用var作为占位符。初始化器和有界语法可以组合如下:
var arrBoundedIni = new int[2,3]...
var arrMixSyx = new int[,]...
内存分配
多维数组以线性方式存储为一个长数组。在内存中,只有一个数组,该数组在逻辑上被分成多个大小相同的维度(等于行数)。Length和Rank属性可用于验证差异,如下所示:
- 长度:它将返回数组中元素的数量。
int[] arr = {1,2,4};
int[,] mulArr = new int[2,3];
Console.WriteLine("Length of arr : {0}", arr.Length); // output: 3
Console.WriteLine("Length of armulArrrMul : {0}", mulArr.Length); // output: 6
mulArr的输出是 6,即:number_of_rows * number_of_elements 即 2 * 3 = 6
- 等级:它将返回数组的维数。
Console.WriteLine("Rank of arr : {0}", arr.Rank); // output: 1
Console.WriteLine("Rank of armulArrrMul : {0}", mulArr.Rank); // output: 2
Console.WriteLine("Rank of array : {0}", new string[2,3,3].Rank); // output: 3
// [2,3,3] = 2 rows(arrays) of 3 arrays, each having 3 elements
注意:C# 提供了一种创建具有不同行大小的多维数组的方法,称为交错数组。与多维数组不同,交错数组由多个一维数组组成,这意味着交错数组的 Rank 属性将始终返回 1。
数组访问
多维数组的项目以矩阵形式表示,可以通过行和列的索引值简单地访问。
// 0 = Section A
// 1 = Section B
string [,] sections = new string[2,3];
sections[0,0] = "Tony";
sections[0,1] = "Samy";
sections[0,2] = "Jane";
sections[1,0] = "Jack";
sections[1,1] = "Hans";
sections[1,2] = "Fred";
循环也可用于遍历数组:
for(int row = 0; row< sections.GetLength(0); row++){
for (int col = 0; col < sections.GetLength(1); col++)
{
char grade = (row == 0) ? 'A' : 'B';
Console.WriteLine("{0} scored grade {1}",sections[row,col],grade); // demo output: Tony scored grade A
}
}
- GetLength:它将返回特定索引处的数组的大小。
foreach提供了一种访问所有值的便捷方法:
foreach (string student in sections)
{
Console.WriteLine("{0}",student);
}
交错数组
交错数组可以包含对其他数组的引用,并且其他数组的大小可以不同。交错数组的元素是数组引用,而多维数组只能存储元素和维度(只是逻辑实体)。考虑一个竞赛中的团队示例,其中团队成员的数量可能有所不同:
string[][] enteries = new string[3][]{
new string[] {"TeamCS", "Dennis", "James", "Guido", "Linus"},
new string[] {"TeamMath", "Ramanujan", "Hardy"},
new string[] {"TeamSc", "Albert", "Tesla", "Newton"},
};
这是具有现有数据的示例。可以声明交错数组,并稍后初始化内部数组:
string[][] enteries = new string[3][];
enteries[0] = new string[4]; // inner array initialization
enteries[1] = new string[2];
enteries[2] = new string[3];
enteries[0][0] = "TeamCS"; // data can be added later
enteries[1][1] = "Ramanujan";
enteries[2][2] = "Tesla";
内部数组引用需要在执行任何访问操作之前使用new运算符进行初始化,因为默认情况下,内部数组被初始化为 null。因此,任何存储数据的尝试都会导致 NullReferenceException,从而导致应用程序崩溃。
访问交错数组
在交错数组中,可以像这样检索和访问内部数组引用:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~