首页 > 编程笔记 > C#笔记 阅读:71

C#二维数组的声明和使用(非常详细,附带实例)

C# 中的二维数组(two dimensional array)就是一维数组的扩充,如果我们将一维数组想象成一维空间,则二维数组就是二维空间,也就是平面。

C#二维数组的声明

假设有 6 笔散乱的数据,如下所示:


如果我们将相同类型的数据组织起来形成 2×3 的二维数组,则可以将数据想象成下图:


当数据排成二维数组后,我们未来可以建立 [row][column] 索引值,通常 column 可以缩写为 col,所以又可以写成是 [row][col],也可以想成是 [行][列] 索引值,用来存取此二维数组特定位置的内容。

二维数组的使用和其他的变量一样,使用前一定要先声明,以便编译程序能预留空间供程序使用,二维数组声明的语法如下:
数据类型[ , ] 变量名称 = new 数据类型[行数][列数];
上述语句中等式右边的数据类型右边有连续的两个中括号,这代表该数组是二维数组,中括号内分别是二维数组行(row)的元素个数和列(column)的元素个数。

例如,声明整数的 2×3 二维数组:
int[ ] sc = new int[2][3];

C#二维数组的初始化

C# 语言允许声明二维数组时直接设定二维数组的初始值,设定二维数组初始值的语法如下:
数据类型 [ ] 变量名称 = { [ 第 1 列的初始值 ],
    [ 第 2 列的初始值 ],
    ...
    [ 第 n 列的初始值 ] };

例如,假设有一个考试成绩如下所示:

学生座号 第 1 次考试 第 2 次考试 第 次考试
1 90 80 95
2 95 90 85

请声明上述考试成绩的初始值:
Int[ , ] sc = {{90, 80, 95},
               {95, 90, 85}};

程序设计时也可以看到有人使用下列方式设定二维数组的初始值:
Int[ , ] sc = {{90, 80, 95}, {95, 90, 85}};  // 不鼓励,会比较不清楚

【实例】列出学生各次考试成绩的应用:
int[,] sc = {{ 90, 80, 95},
    { 95, 90, 85}};

for (int i = 0; i < 2; i++)
    for (int j = 0; j < 3; j++)
        Console.WriteLine($"学生{i+1}的第{j+1}次考试成绩是 {sc[i,j]}");
执行结果为:

学生1的第1次考试成绩是 90
学生1的第2次考试成绩是 80
学生1的第3次考试成绩是 95
学生2的第1次考试成绩是 95
学生2的第2次考试成绩是 90
学生2的第3次考试成绩是 85

上述程序第 6 行,在console.WriteLine() 函数内有 i+1 和 j+1,这是因为数组是从索引 0 开始,而学生座号与考试编号是从 1 始的,所以使用时加 1,比较符合题意。此外,读者需要留意同一行的 sc[i, j],这是存取二维数组第 i 行、第 j 列的元素内容。

C#二维数组与匿名数组

匿名数组也可以用二维数组的方式来表示,可以参考以下内容:
var c = new[]
{
    new[]{1,2,3,4},
    new[]{5,6,7,8}
};
for (int i = 0; i < c.Length; i++)
{
    for (int j = 0; j < c[i].Length; j++)
        Console.Write($"{c[i][j]}\t");
    Console.WriteLine();
}
执行结果为:

1    2    3    4   
5    6    7    8   

读者需要留意取得二维匿名数组的方式,可参考第 10 行的 c[i][j]。

C# foreach遍历二维数组

C# 语言提供一个循环关键词 foreach,可以方便我们遍历数组,这个关键词特别适合我们不知道数组元素的个数时,可以用此方法迭代数组元素内容,此语法如下:
foreach (数据类型 变量 in 数组)
变量的数据类型需与数组元素相同,关键词 foreach 主要是用变量迭代所有的数组元素,在迭代过程也可以使用 break 中断此迭代。

foreach 既可以遍历一维数组,也可以用来遍历二维数组。

例如,foreach 遍历二维数组:
int[,] num = new int[,] {{ 6, 66 },
                        { 2, 22 },
                        { 5, 55 }};

foreach (int n in num)
    Console.Write($"{n} ");
执行结果为:

6 66 2 22 5 55 

C#二维数组的实际应用

声明二维数组的目的有很多,特别是当你设计电玩程序时,若想设计大型字体或图案,就可以利用设定二维数组初始值的方式,来设计此字体或图案。

例如,我想设计一个图案“洪”,则我们可用下列方式设计:
int[,] num = {
    { 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0 },
    { 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0 },
    { 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
    { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0 },
    { 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0 },
    { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
    { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0 },
    { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0 },
    { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1 }
};

for (int i = 0; i < 9; i++)
{
    for (int j = 0; j < 16; j++)
        if (num[i, j] == 1)
            Console.Write("*");
        else
            Console.Write(" ");
    Console.WriteLine("");
}
执行结果为:
**     **   ** 
**    **   ** 
  ** ***********
       **   ** 
****   **   ** 
     ***********
  **   **   ** 
**   **     **
**   **       **

二维数组或多维数组常用于处理计算机图像。有一个位图图像如下所示,是 12×12 点阵,代表英文字母 H。


上述每一个方格称像素,每个图像的像素点都由 0 或 1 组成,如果像素点是 0 则表示此像素是黑色,如果像素点是 1 则表示此像素点是白色。在上述概念下,我们可以用下图来表示计算机存储此英文字母的方式。


因为每一个像素都由 0 或 1 组成,所以称上图为位图表示法,虽然很简单,但其缺点是无法很精确地表示整个图像。因此又有了所谓的灰度图像的概念,详情可以参考下图。


上图虽然也是黑白图像,但是在黑色与白色之间多了许多灰色,因此整个图像相较于位图细腻许多。在计算机科学中使用 0~255 代表灰色的等级,其中 0 代表纯黑色,255 代表纯白色。这 256 个灰度级刚好可以使用 8 个位(Bit)表示,相当于是一个字节(Byte),下列是十进制数值与灰度表。


若是使用上述灰度表,则可以使用一个二维数组代表一个图像,我们将这类图像称为灰度图像。

相关文章