C# 锯齿数组

2025年3月27日 | 阅读 10 分钟

在 C# 中,锯齿数组也称为“数组的数组”,其中主数组的每个元素本身就是一个数组。锯齿数组中每个元素的长度都可以不同。锯齿数组存储的是数组而不是字面值。与多维数组不同,锯齿数组允许内部数组具有不同的长度,这在处理不均匀的数据结构时提供了更大的灵活性。在处理不均匀的数据结构时,它们效率更高。

简单示例

让我们以 C# 中的一个简单锯齿数组示例,它声明、初始化和遍历锯齿数组。

示例

编译并运行

输出

15 25 38 45 
75 28 19 41 35 39

在这里,我们将讨论 C# 中锯齿数组的声明、初始化和访问元素。

锯齿数组的声明

在 C# 锯齿数组中,我们只需要指定行数,而无需指定列数。如果我们定义了锯齿数组的列数,数组就会失去其锯齿特性,变成多维数组。它用两个方括号 `[][]` 声明,表示它是一个数组的数组。

在这里,第一个方括号 `[]` 表示主数组的大小。另一方面,第二个方括号 `[]` 不指定数组的维度,而是表示主数组中的每个元素是另一个数组,该数组可以具有不同的长度。

语法

它具有以下语法:

让我们用一个例子来说明锯齿数组的声明

  • int: 定义数组的数据类型。
  • [][]: 方括号表示锯齿数组。
  • arr: 表示锯齿数组的名称。
  • [2][]: 定义了锯齿数组中数组的数量。

锯齿数组的初始化

我们可以单独为每个元素分配大小,因为锯齿数组的每个成员本身就是一个数组。让我们举一个例子来初始化 C# 中的锯齿数组。

初始化并在锯齿数组中填充元素

在 C# 中,有几种方法可以在锯齿数组中初始化数组。其中一些如下:

1. 使用索引号

一旦在 C# 中初始化了锯齿数组,我们就可以使用索引号对其进行初始化。它使我们能够通过访问其特定的索引位置来动态初始化数组中每个元素的值。

示例

让我们看一个例子来说明如何在 C# 中使用索引号初始化锯齿数组。

示例

其中,

  • 第一个方括号 `[]` 中的索引指定了锯齿数组中行的索引。
  • 第二个方括号 `[]` 中的索引指定了锯齿数组中该特定行的元素索引。

2. 不定义数组元素大小进行初始化

当未预先确定锯齿数组大小时,我们可以直接使用内联初始化并指定特定值来初始化其元素。

示例

让我们看一个例子来说明如何在 C# 中不使用数组大小来初始化锯齿数组。

示例

3. 声明锯齿数组时进行初始化

在 C# 编程中,我们可以在声明时直接使用数组初始化器来初始化锯齿数组。它允许我们在一个步骤中声明和填充数组,使代码更简洁、更具表现力。

示例

让我们看一个例子来说明如何在 C# 中声明锯齿数组时初始化数组。

示例

示例 1: 实现 C# 中锯齿数组的程序。

示例

编译并运行

输出

Row 0: 4 2 5 9 
Row 1: 8 1 7 
Row 2: 6 3 2 5 
Row 3: 9 4 8 1 6

说明

在此示例中,我们创建了一个名为 Tpointtech 的公共类。之后,将一个名为 jaggedArr 的函数声明为具有 4 个元素的锯齿数组,每个元素都可以容纳一个整数数组。此时,内部数组尚未初始化。给定锯齿数组的每个元素都被初始化为一个整数数组。

之后,外层循环遍历锯齿数组的每一行。内层 for each 循环遍历当前行中的每个元素,打印由空格分隔的元素。最后,`console.WriteLine()` 函数在打印完当前行的所有元素后将光标移到下一行,从而确保每一行都显示在单独的行上。

示例 2: 声明时的锯齿数组

让我们以一个简单的锯齿数组示例,它在 C# 中声明时初始化锯齿数组。

示例

编译并运行

输出

25 45 41 78 34 
4 52 36 15 27 73 
2 5 28 31 47 
13 53 72

说明

在此示例中,我们创建了一个名为 JaggedArrayTest 的类。之后,我们声明了一个在声明时具有 4 个元素的锯齿数组,每个元素都可以处理一个整数数组。之后,外层循环遍历锯齿数组的每一行。

内层 for each 循环遍历当前行中的每个元素,打印由空格分隔的元素。最后,`console.WriteLine()` 函数在打印完当前行的所有元素后将光标移到下一行,从而确保每一行都显示在单独的行上。

访问和修改锯齿数组的元素

在 C# 中,我们可以使用两个索引来访问锯齿数组元素。第一个索引指向外层数组(行),第二个索引指向内层数组(列)。

另一方面,我们可以通过使用其索引分配一个新值来修改锯齿数组的元素。

示例

让我们举一个例子来说明如何在 C# 中访问和修改元素。

示例

编译并运行

输出

Accessed Value: 12
Modified Value: 15

说明

在此示例中,我们创建了一个名为 Tpointtech 的类。在这里,我们声明了一个名为 arr 的锯齿数组,它包含 3 行。arr 函数的每个元素都是一个长度可以不同的数组。锯齿数组的每一行都用特定值初始化。

之后,我们访问第二行中的第三个元素,该元素的值为 12,然后我们将先前访问的元素从 12 更新为 15。最后,它会在控制台中打印输出。

锯齿数组与多维数组

在 C# 中,我们还可以利用多维数组中的锯齿数组来创建复杂的数据结构。为了遍历锯齿数组,我们可以使用嵌套循环。外层循环遍历行,内层循环遍历每一行中的元素。

语法

它具有以下语法:

示例

让我们举一个例子来演示在 C# 中多维数组中锯齿数组的遍历。

示例

编译并运行

输出

Elements of the Jagged Array 1:
3 4 
2 7 
5 8 
Elements of the Jagged Array 2:
18 12 
19 22 
35 55 
Elements of the Jagged Array 3:
23 54 
26 84 
67 37 
49 73 
Elements of the Jagged Array 4:
81 32 
5 7 
45 94

说明

在此示例中,我们创建了一个名为 MultiJaggedArray 的类。之后,我们声明了一个包含 4 个元素的锯齿数组,每个元素都是一个二维数组。锯齿数组的每个元素都用一个大小不同的二维数组初始化。

对于每个 2D 数组,它使用 `GetLength(0)` 和 `GetLength(1)` 来检索行数和列数。之后,它遍历每一行和每一列来访问和打印元素。


C# 锯齿数组选择题

1. 如何在 C# 中声明一个具有 3 行的整数锯齿数组?

  1. int[][] jaggedArray = new int[2][];
  2. int[,] jaggedArray = new int[2, ];
  3. int[][] jaggedArray = new int[][2];
  4. int[] jaggedArray = new int[2];

答案: (a) int[][] jaggedArray = new int[2][];


2. 以下代码的输出是什么?

  1. 15
  2. 27
  3. 24
  4. 10

答案: (c) 24


3. 在 C# 中,整数锯齿数组的未初始化元素的默认值是多少?

  1. -1
  2. 0
  3. Null
  4. 未定义

答案: (b) 0


4. 如何在 C# 中使用不同长度的行初始化锯齿数组?

  1. 使用多维数组。
  2. 不可能有不同长度的行。
  3. 通过声明一个一维数组。
  4. 通过单独指定每行的长度。

答案: (d) 通过单独指定每行的长度。


5. 下列关于锯齿数组的说法哪个是正确的?

  1. 锯齿数组是数组的数组,允许每个内部数组具有不同的长度。
  2. 锯齿数组被称为一维数组。
  3. 锯齿数组是行大小固定的多维数组。
  4. 锯齿数组不能包含数组作为元素。

答案: (a) 锯齿数组是数组的数组,允许每个内部数组具有不同的长度。


下一主题C# Params