【从零开始入门unity游戏开发之——C#篇12】新的引用类型——数组array

server/2024/12/19 2:44:41/

文章目录

  • 一、数组(`array`)(一维数组)
    • 1、声明数组
    • 2、初始化数组
    • 3、访问数组元素
    • 4 、修改数组元素
    • 5、获取数组的长度
    • 6、遍历数组
      • 使用 `for` 循环:
      • 使用 `foreach` 循环:
    • 7、数组方法
      • 排序:
      • 逆序:
      • 查找元素:
      • 复制数组:
    • 8、`string.Join`拼接合并数组数据为字符串
      • 语法:
      • 示例:
    • 9、数组的注意事项
  • 二、多维数组
    • 1、二维数组
    • 2、三维数组
    • 3、其他使用
  • 三、交错数组(了解即可,用的很少)
    • 1、什么是交错数组?
    • 2、如何声明和初始化交错数组?
    • 3、访问和操作交错数组中的元素:
    • 4、交错数组的优点与缺点:
    • 5、与二维数组的比较
  • 专栏推荐
  • 完结

一、数组(array)(一维数组)

在 C# 中,数组是一种数据结构,用于存储固定大小同类型元素集合。一般一维数组就简称为数组。数组中的每个元素都通过索引来访问,索引是从 0 开始的。

注意,数组属于引用类型

1、声明数组

要声明一个数组,你需要指定数组的类型,并使用 [] 表示数组。例如:

int[] numbers;  // 声明一个整型数组
string[] names; // 声明一个字符串数组

2、初始化数组

数组可以通过两种方式进行初始化:

  • 显式初始化:在声明时直接指定数组的元素。

    int[] numbers = new int[3] { 1, 2, 3 };// 创建一个包含 3 个整数的数组
    int[] numbers = new int[5]; // 创建一个包含 5 个整数的数组,所有元素默认为 0string[] names = new string[] { "Alice", "Bob", "Charlie" }; // 创建一个包含 3 个字符串的数组
    
  • 简洁初始化:通过数组字面量直接给数组赋值。

    int[] numbers = { 1, 2, 3, 4, 5 }; // 简单初始化数组
    string[] names = { "Alice", "Bob", "Charlie" }; // 初始化字符串数组
    

3、访问数组元素

数组中的元素可以通过索引来访问,索引从 0 开始。例如:

int[] numbers = { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers[0]); // 输出 1,数组的第一个元素
Console.WriteLine(numbers[3]); // 输出 4,数组的第四个元素

4 、修改数组元素

数组的元素是可以修改的,只需通过索引进行赋值:

int[] numbers = { 1, 2, 3, 4, 5 };
numbers[2] = 10; // 修改第三个元素为 10
Console.WriteLine(numbers[2]); // 输出 10

5、获取数组的长度

使用 .Length 属性来获取数组的元素个数:

int[] numbers = { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers.Length); // 输出 5

6、遍历数组

可以使用 for 循环或 foreach 循环来遍历数组。

使用 for 循环:

int[] numbers = { 1, 2, 3, 4, 5 };
for (int i = 0; i < numbers.Length; i++)
{Console.WriteLine(numbers[i]); // 输出数组元素
}

使用 foreach 循环:

int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{Console.WriteLine(number); // 输出数组元素
}

7、数组方法

Array 类提供了一些常用的方法来操作数组,例如:

排序:

int[] numbers = { 5, 3, 8, 1, 2 };
Array.Sort(numbers); // 对数组进行升序排序
foreach (var number in numbers)
{Console.WriteLine(number); // 输出 1, 2, 3, 5, 8
}

逆序:

Array.Reverse(numbers); // 将数组元素逆序
foreach (var number in numbers)
{Console.WriteLine(number); // 输出 8, 5, 3, 2, 1
}

查找元素:

int[] numbers = { 1, 2, 3, 4, 5 };
int index = Array.IndexOf(numbers, 3); // 查找元素 3 的索引
Console.WriteLine(index); // 输出 2

复制数组:

int[] numbers = { 1, 2, 3, 4, 5 };
int[] copiedNumbers = new int[5];
Array.Copy(numbers, copiedNumbers, numbers.Length); // 将 numbers 数组复制到 copiedNumbers
foreach (var number in copiedNumbers)
{Console.WriteLine(number); // 输出 1, 2, 3, 4, 5
}

你可能会问,这有什么用?我完全可以使用=赋值即可

int[] copiedNumbers = numbers;

因为开头已经说过了,数组是应用类型,所以直接使用 int[] copiedNumbers = numbers; 其实是将 copiedNumbers 和 numbers 指向了同一个数组对象,而不是创建一个新的副本。因此,如果你在 copiedNumbers 上做修改,也会影响到 numbers,反之亦然。简而言之,这种方式会导致两个变量共享同一个内存区域。

使用Array.Copy复制数组会实现类似值类型的效果,即创建数组的一个独立副本。这样,当你修改副本时,不会影响原始数组,反之亦然。

8、string.Join拼接合并数组数据为字符串

string.Join 是 C# 中用于将数组或集合中的元素连接成一个单一的字符串的方法。它可以指定一个分隔符,将数组中的每个元素连接起来,形成一个新的字符串。这个方法非常常见,用于打印或格式化数组数据。

语法:

string result = string.Join(string separator, IEnumerable<string> values);
  • separator:用作元素之间的分隔符的字符串。
  • values:一个实现了 IEnumerable 接口的集合,通常是一个数组、列表或其他可枚举的集合。

示例:

假设我们有一个字符串数组,并希望将其连接成一个以逗号分隔的字符串:

string[] fruits = { "Apple", "Banana", "Cherry" };
string result = string.Join(", ", fruits);
Console.WriteLine(result);

输出:

Apple, Banana, Cherry

9、数组的注意事项

  • 数组是固定大小的:一旦数组的大小被指定,它的大小就不能更改。如果需要更改数组的大小,可以创建一个新的数组并复制数据。
  • 数组的索引从 0 开始:访问数组时,必须使用有效的索引,索引超出范围会抛出 IndexOutOfRangeException 异常。
  • 默认值:数组中的元素在初始化时会被赋予默认值。例如,整型数组的默认值是 0,布尔型数组的默认值是 false,引用类型数组的默认值是 null

二、多维数组

C# 支持多维数组(例如,二维数组)。可以通过逗号分隔的多个维度来定义。

1、二维数组

int[,] matrix = new int[3, 3] // 创建一个 3x3 的二维数组
{{ 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 }
};
Console.WriteLine(matrix[1, 2]); // 输出 6,访问第二行第三列的元素

2、三维数组

int[,,] threeDArray = new int[2, 2, 2]
{{ { 1, 2 }, { 3, 4 } },{ { 5, 6 }, { 7, 8 } }
};
Console.WriteLine(threeDArray[1, 0, 1]); // 输出 6

3、其他使用

其他使用和一维数组基本一样,这里就不多介绍了


三、交错数组(了解即可,用的很少)

C# 中的交错数组是一种数组的数组,也就是说,交错数组是一个二维数组的特殊形式,其中每个元素本身也是一个数组。与传统的矩阵型二维数组不同,交错数组中的每一行(即每个子数组)可以具有不同的长度。

1、什么是交错数组?

交错数组其实是一个一维数组,其中的每个元素又是一个数组(可以看作是二维数组的每一行)。这使得每一行的数组长度可以不同,解决了普通二维数组在内存中固定的大小限制问题。

2、如何声明和初始化交错数组?

声明交错数组:

int[][] jaggedArray;

这里,jaggedArray 是一个数组,数组的元素是类型为 int[] 的数组(即一维整数数组)。

初始化交错数组:

jaggedArray = new int[3][];  // 创建一个包含 3 个子数组的交错数组
jaggedArray[0] = new int[4];  // 第一行有 4 个元素
jaggedArray[1] = new int[2];  // 第二行有 2 个元素
jaggedArray[2] = new int[3];  // 第三行有 3 个元素

在这个例子中,jaggedArray 有 3 个元素,分别是长度为 4、2、3 的一维数组。

3、访问和操作交错数组中的元素:

可以通过两层索引来访问交错数组中的元素:

jaggedArray[0][0] = 1;  // 第一行第一列的元素赋值为 1
jaggedArray[1][1] = 5;  // 第二行第二列的元素赋值为 5
Console.WriteLine(jaggedArray[0][0]);  // 输出 1
Console.WriteLine(jaggedArray[1][1]);  // 输出 5

4、交错数组的优点与缺点:

优点:

  • 灵活性:交错数组可以在每一行中存储不同长度的数组,因此能更好地适应数据大小不等的情况。
  • 节省内存:由于每行的数组长度可以不同,所以在内存使用上会更节省,尤其在每行的数据量相差较大的情况下。

缺点:

  • 不连续存储:交错数组的每一行实际上是独立存储的,并不按顺序在内存中存储。这可能会导致一些性能上的开销,尤其是在需要频繁访问数组元素时。
  • 访问复杂度:与普通的二维数组相比,交错数组的访问略显复杂,因为要通过两次索引来访问数据。

5、与二维数组的比较

假设有一个标准的二维数组(矩阵):

int[,] array = new int[3, 4];  // 创建一个 3x4 的二维数组

二维数组在内存中是连续存储的,所有元素按行列顺序存储,具有固定的行和列数。

而交错数组则更灵活,每一行可以有不同的列数,但其内存布局可能不如二维数组那样连续。


专栏推荐

地址
【从零开始入门unity游戏开发之——C#篇】
【从零开始入门unity游戏开发之——unity篇】
【制作100个Unity游戏
【推荐100个unity插件】
【实现100个unity特效】
unity框架开发】

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.ppmy.cn/server/151331.html

相关文章

9 OOM和JVM退出。OOM后JVM一定会退出吗?

首先我们把两个概念讲清楚 OOM是线程在申请堆内存&#xff0c;发现堆内存空间不足时候抛出的异常。 JVM退出的条件如下&#xff1a; java虚拟机在没有守护线程的时候会退出。守护线程是启动JVM的线程&#xff0c;服务于用户线程。 我们简单说下守护线程的功能: 1.日志的记录…

DeepSeek-AI 开源 DeepSeek-VL2 系列,采用专家混合(MoE)架构,重新定义视觉语言人工智能

将视觉与语言的智能融合&#xff0c;已经在视觉语言模型&#xff08;Vision-Language Models&#xff0c;简称VLMs&#xff09;领域实现了重大突破。这些模型致力于同步处理和解释视觉与文本数据&#xff0c;从而使得图像描述、视觉问题回答、光学字符识别&#xff08;Optical …

ChatGPT崩溃引发行业震动:智能化之路需多元发展

今晨&#xff0c;当我如常打开ChatGPT&#xff0c;准备开始一天的工作时&#xff0c;却遭遇了令人措手不及的崩溃。起初&#xff0c;我还天真地以为这只是区域性的网络波动或是账号的小故障&#xff0c;于是费尽心思地清除浏览器缓存、cookies&#xff0c;甚至尝试更换区域设置…

大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

【linux】shell(37)-脚本调试

1. 使用 Shell 调试选项 Shell 提供了多种调试选项&#xff0c;可以用于检查脚本的语法和执行过程。 1.1 -n 选项 作用&#xff1a;读取脚本但不执行&#xff0c;用于检查脚本的语法错误。 用法&#xff1a; bash -n script.sh示例&#xff1a; #!/bin/bash echo "H…

QT数据库(四):QSqlRelationalTableModel 类

关系数据库概念 例如下列departments、majors、studInfo 这 3 个数据表之间存在关系。 主键与外键 标记“**”的是主键字段&#xff0c;标记“*”的是外键字段。主键字段是一个数据表中表示记录唯一性的字段&#xff0c;例如 studInfo 数据表中的 studID 字段。外键字段是与其…

Mac gfortran编译fortran出错

Mac gfortran编译fortran出错提示&#xff1a; ld: unsupported tapi file type !tapi-tbd in YAML file /Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk/usr/lib/libSystem.tbd for architecture x86_64 collect2: error: ld returned 1 exit status 解决办法&…