C# 数组教程:创建、声明、初始化

⚡ 智能摘要

C# 数组使用同一个变量名存储固定大小的元素集合,这些元素具有相同的数据类型。每个元素都位于从零开始的索引处,因此声明、初始化和访问值都保持快速且可预测。

  • 📌 定义: 数组可以存储同一类型的多个值,这些值位于可通过单个变量访问的索引位置。
  • 宣言: 数据类型后跟方括号和名称,表示一个数组,例如 Int32[] values。
  • 🔢 初始化: 新的关键字设置大小,然后每个索引都会获得一个值,例如 values[0]=1。
  • 🔍 权限: 基于零的索引可以读取或写入任何元素,因此第一个元素是 values[0],计数从 0 开始。
  • 🔁 迭代: foreach 循环会遍历每个没有索引的元素,从而避免在大数组中出现超出范围的错误。
  • 🤖 人工智能辅助: GitHub Copilot 生成数组样板代码,而 ML.NET 将数值数组加载为机器学习模型的特征。

C# 数组

C# 中的数组是什么?

数组用于存储元素的集合或一系列。这些元素将是同一类型。

例如,如果您有一个整数值数组,则该数组可以是 [1, 2, 3, 4] 之类的值的集合。这里数组中的元素数量为 4。

当你想存储一组相同类型的值时,数组非常有用。因此,与其声明一个 变量 对于每个元素,您只需声明一个变量。

该变量将指向一个元素数组或列表,负责存储数组的元素。

让我们看看如何在 C# 中使用数组。在我们的示例中,我们将声明一个整数数组并相应地使用它们。

请注意,以下所有代码均已添加到 Program.cs 文件中。

步骤1) 声明数组 – 第一步是声明一个数组。让我们通过以下代码示例看看如何实现这一点。

C# 中的数组

Code 解释:-

  1. 第一部分是 数据类型。它指定数组中使用的元素类型。因此,在我们的例子中,我们创建了一个整数数组。
  2. 第二部分 [ ],指定数组的秩。(秩是一个占位符,指定数组将包含的元素数量)
  3. 接下来是数组的名称,在我们的例子中是“值”。请注意,您会看到一条绿色波浪下划线,不用担心。这只是 .Net 表示您已声明了一个数组,但没有在任何地方使用它。

步骤2) 下一步是初始化数组。在这里,我们将指定数组将保存的值的数量。我们还将为数组的每个元素分配值。

C# 中的数组

Code 解释:-

  1. 首先,我们将数组将保存的元素数量设置为 3。因此在方括号中,我们表示数组将保存 3 个元素。
  2. 接下来,我们要给数组中的每个元素赋值。我们可以通过指定变量名加上数组中的索引位置来实现。所以 `values[0]` 表示我们将值存储在数组的第一个位置。类似地,要访问第二个位置,我们使用 `values[1]`,依此类推。

注意:: – 在数组中,索引位置从 0 开始。

步骤3) 现在让我们在控制台中显示数组的各个元素。让我们添加以下代码来实现这一点。

C# 中的数组

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args) 
  {
   Int32[] value;
   value=new Int32[3];
   
   value[0]=1;
   value[1]=2;
   value[2]=3;
   
   Console.WriteLine(value[0]);
   Console.WriteLine(value[1]);
   Console.WriteLine(value[2]);
    
   Console.ReadKey(); 
  }
 }
}

Code 解释:-

这是简单的部分,其中我们只使用 Console.WriteLine 方法将元素的每个值发送到控制台。

再次注意,我们借助数组变量名以及索引位置来访问每个元素。

如果正确输入上述代码并执行程序,将显示以下输出。

输出:

C# 中的数组

从输出中,您可以看到数组的所有值都显示在控制台中。

如何使用 foreach 循环遍历 C# 数组

按索引读取每个元素虽然可行,但当数组包含大量值时会变得非常繁琐。foreach 循环提供了一种更简洁的方式,可以按顺序访问数组中的每个元素,而无需 trac自己定义一个索引变量。

foreach 语句会逐个从数组中取出元素,并将其复制到一个循环变量中。然后在循环体内使用该变量。由于循环会在到达最后一个元素时自动停止,因此 foreach 避免了读取数组末尾之外元素的风险。

using System;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Int32[] values = new Int32[3] {1, 2, 3};
   foreach (Int32 item in values)
   {
    Console.WriteLine(item);
   }
   Console.ReadKey();
  }
 }
}

上面的例子声明并初始化了一个包含三个整数的数组,然后使用 foreach 循环遍历该数组。每次遍历时,变量 项目 接收到下一个值后,Console.WriteLine 会将其打印出来。输出结果是分别在三行上显示数字 1、2 和 3。

关于使用数组的 foreach 循环,需要记住的关键点:

  • 循环变量是只读的,因此 foreach 最适合读取值而不是就地更改值。
  • 在查看时修改元素ping请使用带索引的 for 循环代替。
  • foreach 可以用于一维数组、多维数组以及任何支持迭代的集合。

C# 多维数组

目前展示的数组都是一维数组,这意味着它们存储的是一个简单的数值列表。C# 也支持多维数组,多维数组的元素以行和列的网格形式排列。二维数组是最常见的数组形式,适用于矩阵、棋盘和表格等数据。

您可以通过在方括号内放置逗号来声明二维数组。每增加一个逗号,数组就会增加一个维度,因此 `int[,]` 表示二维数组,而 `int[,,]` 表示三维数组。然后,可以通过每个维度的索引来访问数组元素。

using System;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   int[,] matrix = new int[2, 2] { {1, 2}, {3, 4} };
   Console.WriteLine(matrix[0, 0]);
   Console.WriteLine(matrix[1, 1]);
   Console.ReadKey();
  }
 }
}

这里,数组 matrix 包含两行两列。元素 matrix[0, 0] 返回 1,matrix[1, 1] 返回 4。数组的维度数在声明时就已确定,而每个维度的大小在创建数组时设置。

C# 锯齿数组

交错数组是指元素本身也是数组的数组。与矩形多维数组不同,交错数组的每个内部数组的长度可以不同,因此它也被称为“数组的数组”。这种灵活性在行值数量自然不同的情况下非常有用。

您可以使用两组方括号声明一个交错数组,然后分别创建每个内部数组。以下示例创建了一个交错数组,其中第一行包含三个值,第二行包含两个值。

using System;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   int[][] jagged = new int[2][];
   jagged[0] = new int[] {1, 2, 3};
   jagged[1] = new int[] {4, 5};
   Console.WriteLine(jagged[0][2]);
   Console.WriteLine(jagged[1][1]);
   Console.ReadKey();
  }
 }
}

表达式 jagged[0][2] 读取第一行的第三个元素,即 3,而 jagged[1][1] 读取第二行的第二个元素,即 5。由于每一行都是一个单独的数组,因此当行长度变化时,交错数组可以有效地利用内存,尽管它们需要额外的步骤来初始化每个内部数组。

常见问题

Length 属性返回 C# 数组中元素的总数。例如,对于一个包含三个元素的数组,values.Length 返回 3。对于多维数组,GetLength(dimension) 返回每个特定维度的大小。

AC# 数组在创建时大小固定,而 List 则会动态增长和缩小。数组处理固定数据速度更快,开销更小,而 List 更适合元素数量在运行时发生变化的集合。

标准的 C# 数组只能存储单一类型的元素,因此不允许混合使用不同类型的元素。要存储不同类型的元素,可以声明一个 object[] 数组或使用类似 ArrayList 的集合,但这两种方法都会牺牲编译时的类型安全性。

静态方法 Array.Sort 将 C# 数组中的元素按升序排列。将数组传递给 Array.Sort(values),然后使用 Array。Reverse 之后按降序排列。排序适用于数字、字符串和其他类似类型。

`Array.Copy` 方法会将一个数组中的特定范围元素复制到另一个数组中,而 `Clone` 方法则会创建整个数组的浅拷贝。将一个数组变量赋值给另一个数组变量只会复制引用,而不会复制底层元素。

当代码访问数组中不存在的位置时,例如访问三元素数组中的 `values[5]`,就会发生 `IndexOutOfRangeException` 异常。由于 C# 数组的索引从零开始,有效索引范围为 0 到数组长度减 1。因此,务必先验证索引。

是的。GitHub Copilot 会根据 Visual Studio 中的注释或方法名称来建议数组声明、初始化和循环逻辑。 VS Code. Rev请查看每个建议,以确保尺寸和索引边界正确,因为 Copilot 可能会引入差一错误和超出范围错误。

ML.NET 将特征向量和模型输入表示为 C# 数组,通常是 float[] 数组。训练数据加载到数组或 span 中,预测结果返回分数数组。数组的固定大小和快速索引使其在机器学习流程中非常高效。

总结一下这篇文章: