🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。 🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 🏆🎉欢迎 👍点赞✍评论⭐收藏
数据结构是计算机科学中的一个重要概念,它描述了数据之间的组织方式和关系,以及对这些数据的访问和操作。常见的数据结构有:数组、链表、栈、队列、哈希表、树、堆和图。
数组是一种线性数据结构,其基本思想是将相同类型的元素存储在一块连续的内存空间中,通过数组下标来访问元素。数组的下标从0开始,每个元素在内存中的地址也可以通过下标和数组的起始地址计算得出。
数组的优点是可以快速地访问元素,因为可以通过下标直接定位到元素的内存地址。另外,数组的内存空间是连续的,因此在读取或写入一段连续的元素时,在缓存机制的帮助下会有更好的性能表现。
数组的缺点是其大小是静态的,无法动态扩展或缩小。如果数组已经占用了所有可用的内存空间,但需要添加更多的元素,就需要重新申请一个更大的数组,并将原数组的元素复制到新数组中,这样做效率较低。此外,删除数组中的元素也会涉及到元素的移动,同样会影响效率。
在 C# 中,可以使用以下几种方式来初始化数组:
int[] numbers = { 1, 2, 3, 4, 5 };
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
int[] numbers = new int[5];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;
int[,] matrix = new int[,] { { 1, 2 }, { 3, 4 } };
int[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[] { 1, 2, 3 };
jaggedArray[1] = new int[] { 4, 5 };
在C#中,可以使用以下语法初始化一个数组:
int[] myArray = new int[] {1, 2, 3, 4, 5};
要访问数组元素,可以使用以下语法:
int value = myArray[0];
Console.WriteLine(value); // 输出1
其中,[0]
表示访问第一个元素,数组下标从0开始。
/* 随机访问元素 */
int randomAccess(int[] nums) {
Random random = new();
// 在区间 [0, nums.Length) 中随机抽取一个数字
int randomIndex = random.Next(nums.Length);
// 获取并返回随机元素
int randomNum = nums[randomIndex];
return randomNum;
}
在数组中访问元素是非常高效的,我们可以在 O(1) 时间内随机访问数组中的任意一个元素。
可以使用数组(Array)的Copy方法来实现。
int[] arr = new int[5] { 1, 2, 3, 4, 5 };
int index = 2; //需要插入元素的位置
int insertValue = 10; //需要插入的元素
int[] newArr = new int[arr.Length + 1]; //新数组比原数组多一个元素
//复制原数组前半部分
Array.Copy(arr, 0, newArr, 0, index);
//插入新元素
newArr[index] = insertValue;
//复制原数组后半部分
Array.Copy(arr, index, newArr, index + 1, arr.Length - index);
//输出新数组
foreach (int num in newArr)
{
Console.Write(num + " ");
}
运行以上代码,输出结果为:1 2 10 3 4 5。可以看到,原数组中的第3个元素(即值为3的元素)被移动到新数组中的第4个位置,而新元素10被插入到原位置上。
/* 在数组的索引 index 处插入元素 num */
void insert(int[] nums, int num, int index) {
// 把索引 index 以及之后的所有元素向后移动一位
for (int i = nums.Length - 1; i > index; i--) {
nums[i] = nums[i - 1];
}
// 将 num 赋给 index 处元素
nums[index] = num;
}
值得注意的是,由于数组的长度是固定的,因此插入一个元素必定会导致数组尾部元素的“丢失”。
使用Array.Copy()方法创建一个新的数组,将要删除的元素之前的元素复制到新数组中,将要删除的元素之后的元素也复制到新数组中,从而删除该元素。
int[] arr = new int[] { 1, 2, 3, 4, 5 };
int removeIndex = 2;
int[] newArr = new int[arr.Length - 1];
Array.Copy(arr, 0, newArr, 0, removeIndex);
Array.Copy(arr, removeIndex + 1, newArr, removeIndex, arr.Length - removeIndex - 1);
foreach (int num in newArr)
{
Console.WriteLine(num);
}
/* 删除索引 index 处元素 */
void remove(int[] nums, int index) {
// 把索引 index 之后的所有元素向前移动一位
for (int i = index; i < nums.Length - 1; i++) {
nums[i] = nums[i + 1];
}
}
删除元素完成后,原先末尾的元素变得“无意义”了,所以我们无须特意去修改它。
在C#中,有许多方法可以遍历数组,以下是几个常见的方法:
int[] arr = { 1, 2, 3, 4, 5 };
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
int[] arr = { 1, 2, 3, 4, 5 };
foreach (int item in arr)
{
Console.WriteLine(item);
}
int[] arr = { 1, 2, 3, 4, 5 };
Array.ForEach(arr, item => Console.WriteLine(item));
int[] arr = { 1, 2, 3, 4, 5 };
var result = from item in arr
select item;
foreach (var item in result)
{
Console.WriteLine(item);
}
C#中可以使用以下两种方式查找数组元素:
int[] arr = { 1, 2, 3, 4, 5 };
int element = 3;
int index = -1;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] == element)
{
index = i;
break;
}
}
if (index == -1)
{
Console.WriteLine("元素未找到");
}
else
{
Console.WriteLine($"元素 {element} 的位置为 {index}");
}
int[] arr = { 1, 2, 3, 4, 5 };
int element = 3;
int index = Array.IndexOf(arr, element);
if (index == -1)
{
Console.WriteLine("元素未找到");
}
else
{
Console.WriteLine($"元素 {element} 的位置为 {index}");
}
其中,Array.IndexOf方法接收两个参数,第一个参数为要查找的数组,第二个参数为要查找的元素。如果查找到了元素,返回其在数组中的位置(从0开始),否则返回-1。
在 C# 中,数组的扩容可以使用 Array 类的 Resize 方法或创建一个新数组并将原始数组中的元素复制到它的方式来实现。
Array.Resize 方法允许您更改数组的大小。它接受两个参数:要调整大小的数组和新的数组大小。
例如,如果要将一个名为 myArray 的整数数组扩展为 10 个元素,可以使用以下代码:
int[] myArray = new int[5];
Array.Resize(ref myArray, 10);
在上面的示例中,使用了 ref 关键字来将 myArray 作为传递给 Resize 方法的参数。
如果您想要创建一个新的具有更大大小的数组,则可以使用以下代码:
int[] oldArray = new int[5];
int[] newArray = new int[10];
for (int i = 0; i < oldArray.Length; i++)
{
newArray[i] = oldArray[i];
}
oldArray = newArray;
在上面的示例中,我们先创建了一个名为 oldArray 的数组,它有五个元素。然后,我们创建了一个名为 newArray 的新数组,它有十个元素。接下来,我们使用 for 循环将 oldArray 中的元素复制到 newArray 中,然后使用 oldArray = newArray 将新数组分配给旧数组。现在,oldArray 变成了一个具有十个元素的数组。
需要注意的是,在调整数组大小时,对于值类型元素,新的元素将设置为默认值(例如,在一个 int 数组中,新元素将设置为 0)。对于引用类型元素,新元素将设置为 null。
C#数组的优点包括:
C#数组的缺点包括:
数组是一种常见的数据结构,广泛应用于编程和数据处理中。以下是数组的一些应用场景: