数组基础信息

假设我们在一家公司的反欺诈部门工作,该公司将在线卖家与基于佣金的广告商进行匹配。广告商已通知我们,最近出现了大量信用卡退单。这些退单发生在佣金支付后的几个月,此时窃贼已经消失很久了。公司要求我们审查几个订单,希望能识别出欺诈标记。也许公司以后可以使用这些标记来识别潜在的虚假购买情况。

我们需要处理一系列订单 ID。因为我们想要识别和分析这些订单,找出共同特征,所以这些订单之间需要有所关联。由于无法提前知道需要查看多少订单,所以无法创建单个变量来保存每个订单 ID。如何创建数据结构来保存多个相关值?

什么是数组

数组是可通过单个变量名称进行访问的一系列单个数据元素。使用从零开始的数字索引访问数组中的每个元素。如你所见,数组能够收集相似的数据(这些数据在单个数据结构中共享共同用途或特征),以便于进行处理。

声明数组

数组是一种特殊类型的变量,可以保存同一数据类型的多个值。因为必须同时指定数组的数据类型和大小,所以声明语法略有不同。

声明新数组

若要声明保存三个元素的字符串数组。

string[] fraudulentOrderIDs = new string[3];

new 运算符在可容纳三个字符串值的计算机内存中创建数组的新实例。有关 new 关键字的详细信息,请参阅模块 " 使用 C# 从 .NET 类库调用方法 "。

请注意,第一组方括号 [] 只是告知编译器,名为 fraudulentOrderIDs 的变量将是数组,而第二组方括号 [3] 包含数组要保存的元素编号。

备注

虽然此示例只声明一个字符串数组,但可以创建每个数据类型的数组,其中包括基元(如 int 和 bool)以及更复杂的数据类型(如类)。此示例使用字符串的简单性来最大程度地减少在入门时需要掌握的新想法数量。

为数组的元素赋值

此时,我们已声明了一个字符串数组,但该数组的每个元素都为空。若要访问数组的元素,请使用方括号内从零开始的数字索引。

像常规变量一样,使用 = 分配值进行赋值。

为数组中的元素赋值

以下代码将向数组的每个元素分配订单 ID。

string[] fraudulentOrderIDs = new string[3];

fraudulentOrderIDs[0] = "A123";
fraudulentOrderIDs[1] = "B456";
fraudulentOrderIDs[2] = "C789";

尝试使用超出数组界限的索引

可能一开始看起来并不直观,但请务必记住,我们要声明的是数组中元素的计数。但是,我们从零开始访问数组中的每个元素。因此,若要访问数组中的第二个项,请使用索引 1

初学者可能会忘记数组是从零开始的,所以他们会尝试访问不存在的数组元素。之所以发生这种情况,是由于你曾尝试访问数组边界之外的元素,所以会出现运行时异常的情况。

让我们尝试使用索引 3 来访问数组中的第四个元素,即可有意中断应用程序。

fraudulentOrderIDs[3] = "D000";

整个代码示例现在应与后面显示的内容相匹配。

string[] fraudulentOrderIDs = new string[3];

fraudulentOrderIDs[0] = "A123";
fraudulentOrderIDs[1] = "B456";
fraudulentOrderIDs[2] = "C789";
fraudulentOrderIDs[3] = "D000";

运行应用时,你将收到一条较长的错误消息。注意前两行内容。你会看到以下错误消息。请特别注意包含单词 array 的句子。

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.

现在,请注释掉刚才在此步骤中添加的代码行。

// fraudulentOrderIDs[3] = "D000";

获取数组中元素的值

可以采用相同的方式从数组的元素中获取值。使用元素的索引来检索元素的值。

检索数组的值

使用字符串内插来修改步骤 3 中的代码,以写出每个虚假订单 ID 的值。代码应与以下代码段相匹配。

string[] fraudulentOrderIDs = new string[3];

fraudulentOrderIDs[0] = "A123";
fraudulentOrderIDs[1] = "B456";
fraudulentOrderIDs[2] = "C789";
// fraudulentOrderIDs[3] = "D000";

Console.WriteLine($"First: {fraudulentOrderIDs[0]}");
Console.WriteLine($"Second: {fraudulentOrderIDs[1]}");
Console.WriteLine($"Third: {fraudulentOrderIDs[2]}");

// First: A123
// Second: B456
// Third: C789

重新分配数组的值

数组的元素与任何其他变量值一样,你可以为数组的每个元素分配、检索和重新分配值。

将以下代码行添加到 .NET 编辑器的底部。在此,重新分配数组中第一个元素的值,然后将其打印出来。

fraudulentOrderIDs[0] = "F000";

Console.WriteLine($"Reassign First: {fraudulentOrderIDs[0]}");

.NET 编辑器应与以下代码段相匹配。

string[] fraudulentOrderIDs = new string[3];

fraudulentOrderIDs[0] = "A123";
fraudulentOrderIDs[1] = "B456";
fraudulentOrderIDs[2] = "C789";
// fraudulentOrderIDs[3] = "D000";

Console.WriteLine($"First: {fraudulentOrderIDs[0]}");
Console.WriteLine($"Second: {fraudulentOrderIDs[1]}");
Console.WriteLine($"Third: {fraudulentOrderIDs[2]}");

fraudulentOrderIDs[0] = "F000";

Console.WriteLine($"Reassign First: {fraudulentOrderIDs[0]}");

// First: A123
// Second: B456
// Third: C789
// Reassign First: F000

初始化数组

就像在声明变量时可以对其进行初始化一样,可以在使用带有大括号的特殊语法来声明新数组时,初始化新的数组。

初始化数组

使用多行注释 (/* … */) 来注释掉声明 fraudulentOrderIDs 变量的行,并为其每个元素赋值。然后,在单个代码行中添加以下行,该行使用相同的值声明和初始化数组。

string[] fraudulentOrderIDs = { "A123", "B456", "C789" };

因此,代码现在应与在后面段落中看到的内容相匹配。

/*
string[] fraudulentOrderIDs = new string[3];

fraudulentOrderIDs[0] = "A123";
fraudulentOrderIDs[1] = "B456";
fraudulentOrderIDs[2] = "C789";
// fraudulentOrderIDs[3] = "D000";
*/

string[] fraudulentOrderIDs = { "A123", "B456", "C789" };

Console.WriteLine($"First: {fraudulentOrderIDs[0]}");
Console.WriteLine($"Second: {fraudulentOrderIDs[1]}");
Console.WriteLine($"Third: {fraudulentOrderIDs[2]}");

fraudulentOrderIDs[0] = "F000";

Console.WriteLine($"Reassign First: {fraudulentOrderIDs[0]}");

运行应用程序时,输出不会发生更改。

First: A123
Second: B456
Third: C789
Reassign First: F000

获取数组大小

根据数组的创建方式,你可能无法提前知道一个数组包含多少元素。若要确定数组的大小,可使用 Length 属性。

使用数组的 Length 属性来打印虚假订单的编号

Console.WriteLine($"There are {fraudulentOrderIDs.Length} fraudulent orders to process.");

代码现在应与以下代码段相匹配。

/*
string[] fraudulentOrderIDs = new string[3];

fraudulentOrderIDs[0] = "A123";
fraudulentOrderIDs[1] = "B456";
fraudulentOrderIDs[2] = "C789";
// fraudulentOrderIDs[3] = "D000";
*/

string[] fraudulentOrderIDs = { "A123", "B456", "C789" };

Console.WriteLine($"First: {fraudulentOrderIDs[0]}");
Console.WriteLine($"Second: {fraudulentOrderIDs[1]}");
Console.WriteLine($"Third: {fraudulentOrderIDs[2]}");

fraudulentOrderIDs[0] = "F000";

Console.WriteLine($"Reassign First: {fraudulentOrderIDs[0]}");

Console.WriteLine($"There are {fraudulentOrderIDs.Length} fraudulent orders to process.");

// First: A123
// Second: B456
// Third: C789
// Reassign First: F000
// There are 3 fraudulent orders to process.

概括

使用数组时,应谨记以下重要事项。