C#入门(5):数组、一维数组,二维数组、交错数组、数组复制

在C#中,数组是一种用于存储相同类型元素的数据结构。数组提供了一种有序、索引访问的方式,使得可以通过索引快速访问和修改数组中的元素。在C#中,主要有一维数组和二维数组两种类型。

一维数组(Single-Dimensional Array):

一维数组是最简单的数组类型,它包含在一个单一的行中。在声明一维数组时,需要指定数组元素的类型和数组的大小。

示例代码:

// 声明和初始化一维数组
int[] myArray = new int[5]; // 声明一个包含5个整数的一维数组// 初始化数组元素
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
myArray[3] = 4;
myArray[4] = 5;// 使用循环遍历数组元素
for (int i = 0; i < myArray.Length; i++)
{Console.WriteLine(myArray[i]);
}

二维数组(Two-Dimensional Array):

二维数组是由行和列组成的表格状数据结构。在声明二维数组时,需要指定数组元素的类型以及数组的行数和列数。

示例代码:

// 声明和初始化二维数组
int[,] my2DArray = new int[3, 4]; // 声明一个3行4列的二维数组// 初始化数组元素
my2DArray[0, 0] = 1;
my2DArray[0, 1] = 2;
// 依此类推...// 使用嵌套循环遍历二维数组
for (int row = 0; row < 3; row++)
{for (int col = 0; col < 4; col++){Console.Write(my2DArray[row, col] + " ");}Console.WriteLine(); // 在每行结束时换行
}

在这个示例中,my2DArray 是一个3行4列的二维数组,通过两层循环遍历数组元素。

无论是一维数组还是二维数组,它们都可以包含任意类型的元素。数组在C#中是引用类型,因此它们在传递给方法时会以引用的方式传递,可以通过索引来读取或修改数组中的元素。

数组做函数参数

将一维数组和二维数组作为函数参数:

在C#中,可以将一维数组和二维数组作为函数的参数传递。当数组作为参数传递时,实际上传递的是数组的引用,因此在函数内对数组的修改会影响到原始数组。

一维数组作为函数参数:

using System;class Program
{static void ModifyArray(int[] arr){for (int i = 0; i < arr.Length; i++){arr[i] *= 2; // 修改原始数组中的元素}}static void Main(){int[] myArray = { 1, 2, 3, 4, 5 };Console.WriteLine("Original Array:");foreach (int num in myArray){Console.Write(num + " ");}Console.WriteLine();ModifyArray(myArray);Console.WriteLine("Modified Array:");foreach (int num in myArray){Console.Write(num + " ");}Console.WriteLine();}
}

二维数组作为函数参数:

using System;class Program
{static void Modify2DArray(int[,] arr){for (int i = 0; i < arr.GetLength(0); i++){for (int j = 0; j < arr.GetLength(1); j++){arr[i, j] *= 2; // 修改原始二维数组中的元素}}}static void Main(){int[,] my2DArray = { { 1, 2, 3 }, { 4, 5, 6 } };Console.WriteLine("Original 2D Array:");for (int i = 0; i < my2DArray.GetLength(0); i++){for (int j = 0; j < my2DArray.GetLength(1); j++){Console.Write(my2DArray[i, j] + " ");}Console.WriteLine();}Modify2DArray(my2DArray);Console.WriteLine("Modified 2D Array:");for (int i = 0; i < my2DArray.GetLength(0); i++){for (int j = 0; j < my2DArray.GetLength(1); j++){Console.Write(my2DArray[i, j] + " ");}Console.WriteLine();}}
}

函数返回数组:

在C#中,函数可以返回一维数组或者多维数组。以下是一个返回一维数组的示例:

using System;class Program
{static int[] CreateArray(int size){int[] newArray = new int[size];for (int i = 0; i < size; i++){newArray[i] = i + 1;}return newArray;}static void Main(){int[] resultArray = CreateArray(5);Console.WriteLine("Returned Array:");foreach (int num in resultArray){Console.Write(num + " ");}Console.WriteLine();}
}

对于返回二维数组的情况,也可以采用类似的方法。函数内部可以创建并初始化数组,然后将数组作为返回值返回给调用方。

交错数组

C#中的交错数组(Jagged Array)是一个数组的数组。这意味着它的每个元素都是另一个数组。交错数组与多维数组不同,因为它的行可以有不同的长度,这使得交错数组更加灵活。

交错数组的定义和初始化:

交错数组的声明类似于一维数组,但它使用额外的一组方括号 [] 来指示它是一个数组的数组。下面是声明和初始化交错数组的一个例子:

using System;class Program
{static void Main(){// 声明一个交错数组int[][] jaggedArray = new int[3][];// 初始化交错数组的每个元素(即每行)jaggedArray[0] = new int[4] { 1, 2, 3, 4 };    // 第一行有4个元素jaggedArray[1] = new int[3] { 5, 6, 7 };       // 第二行有3个元素jaggedArray[2] = new int[2] { 8, 9 };          // 第三行有2个元素// 遍历交错数组并打印元素for (int i = 0; i < jaggedArray.Length; i++){for (int j = 0; j < jaggedArray[i].Length; j++){Console.Write(jaggedArray[i][j] + " ");}Console.WriteLine();}}
}

交错数组的特点:

  1. 行的长度可变:交错数组的每一行可以有不同的长度,这与传统的多维数组不同。

  2. 灵活性:由于行的长度可以不同,交错数组提供了更高的灵活性,适合那些行长度各不相同的情况。

  3. 内存效率:在某些情况下,交错数组比规则的多维数组更加内存高效,尤其是当数组的某些行比其他行小得多时。

  4. 访问元素:访问交错数组的元素与访问一维数组类似,但需要通过两个索引——第一个索引是行的索引,第二个索引是行内的元素索引。

交错数组在处理不规则数据结构时非常有用,例如在每行数据长度不一致的表格或其他类型的数据集中。

交错数组做函数参数

在C#中,交错数组也可以作为函数的参数进行传递。由于交错数组本质上是一个数组的数组,因此在作为参数传递时,它们的处理方式与一维数组相似。

交错数组作为函数参数的示例:

以下是一个将交错数组作为参数传递给函数的例子,该示例演示了如何在函数中处理交错数组。

示例代码:
using System;class Program
{// 定义一个接收交错数组作为参数的函数static void PrintJaggedArray(int[][] jaggedArr){for (int i = 0; i < jaggedArr.Length; i++){for (int j = 0; j < jaggedArr[i].Length; j++){Console.Write(jaggedArr[i][j] + " ");}Console.WriteLine();}}static void Main(){// 声明并初始化一个交错数组int[][] myJaggedArray = new int[][]{new int[] { 1, 2, 3 },new int[] { 4, 5, 6, 7 },new int[] { 8, 9 }};// 调用函数并传递交错数组PrintJaggedArray(myJaggedArray);}
}

注意点:

  1. 引用传递:与一维和二维数组类似,交错数组作为参数传递给函数时,传递的是引用。因此,对函数内数组元素的任何更改都会反映到原始数组上。

  2. 灵活性处理:由于交错数组的每个子数组可以有不同的长度,因此在处理交错数组时,需要注意每个子数组的长度可能不同。

  3. 参数类型:在定义接受交错数组为参数的函数时,参数类型应该清楚地指定为交错数组类型,例如 int[][]

交错数组作为参数的处理方式为开发者提供了灵活地处理不规则数据结构的能力,特别是在处理行或列大小不一的复杂数据时非常有用。

数组复制

System.Array.CopyTo()System.Array.Clone() 是用于数组复制的两种不同方法,它们在实现和用途上有一些区别。

System.Array.CopyTo() 方法:

CopyTo() 方法用于将数组的元素复制到另一个数组。它是 Array 类的实例方法,可以用于复制一个数组的内容到另一个数组,前提是目标数组具有足够的空间来容纳源数组的元素。

示例:
using System;class Program
{static void Main(){int[] sourceArray = { 1, 2, 3, 4, 5 };int[] destinationArray = new int[5];// 使用 CopyTo() 方法复制数组sourceArray.CopyTo(destinationArray, 0);// 输出目标数组Console.WriteLine("Destination Array:");foreach (int num in destinationArray){Console.Write(num + " ");}}
}

System.Array.Clone() 方法:

Clone() 方法用于创建当前数组的浅表副本。它是 Array 类的实例方法,返回一个新数组,该数组是原始数组的浅表副本。浅表副本意味着数组元素本身被复制,但如果数组包含引用类型的元素(如对象),则引用仍然指向相同的对象。

示例:
using System;class Program
{static void Main(){int[] sourceArray = { 1, 2, 3, 4, 5 };// 使用 Clone() 方法创建数组的浅表副本int[] clonedArray = (int[])sourceArray.Clone();// 修改源数组的一个元素sourceArray[0] = 10;// 输出两个数组Console.WriteLine("Source Array:");foreach (int num in sourceArray){Console.Write(num + " ");}Console.WriteLine("\nCloned Array:");foreach (int num in clonedArray){Console.Write(num + " ");}}
}

区别:

  1. 深度复制 vs 浅表副本

    • CopyTo() 执行深度复制,将源数组的元素值复制到目标数组,两者之间没有引用关系。
    • Clone() 创建一个浅表副本,新数组的元素值与原始数组相同,但引用类型的元素仍然指向相同的对象。
  2. 返回类型

    • CopyTo() 不返回新的数组,而是将元素复制到现有的目标数组。
    • Clone() 返回一个新数组,该数组是原始数组的浅表副本。
  3. 目标数组要求

    • 在使用 CopyTo() 时,需要提供足够空间的目标数组。
    • 使用 Clone() 时,不需要提供目标数组,方法会自动创建并返回一个新数组。

选择使用哪个方法取决于你的需求。如果需要深度复制并且已有目标数组,可以使用 CopyTo()。如果需要创建一个新数组,且对引用类型元素的修改不影响原数组,可以使用 Clone()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/151656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud -Token传递之Feign

目录 方法一 RequestHeader 方法二 使用Feign的Interceptor 步骤一 实现RequestInterceptor接口 步骤二&#xff1a;配置Feign 通常微服务对于用户认证信息解析有两种方案 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去。在…

YOLOv5 配置C2模块构造新模型

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营 &#x1f356; 原作者&#xff1a;[K同学啊] &#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb4…

【Linux】Linux下的基础IO

❤️前言 大家好&#xff01;今天这篇博客和大家聊一聊关于Linux下的基础IO。 正文 在阅读本篇博客之前&#xff0c;请大家先回顾一下C语言文件操作的一些方法&#xff0c;这里可以看看我之前记录的一些内容&#xff1a; 【C语言】C语言成长之路之文件操作_MO_lion的博客-CSD…

mysql使用--表达式和函数

1.表达式 如&#xff1a;11&#xff0c;一般包含操作数&#xff0c;运算符。 _1.操作数 MYSQL中最常用的操作数有以下几种 (1).常数 (2).列名&#xff0c;针对某个具体的表&#xff0c;它的列名可被当作表达式的一部分 (3).函数调用 一个函数用于完成某个特定的功能。比如NOW()…

【PyQt小知识 - 3】: QComboBox下拉框内容的设置和更新、默认值的设置、值和下标的获取

QComboBox 内容的设置和更新 from PyQt5.QtWidgets import * import sysapp QApplication(sys.argv)mainwindow QMainWindow() mainwindow.resize(200, 200) # 设置下拉框 comboBox QComboBox(mainwindow) comboBox.addItems([上, 中, 下])button QPushButton(更新, main…

Colab跑项目

这里写目录标题 Colab文件目录路径显示更改colab当前工作文件夹Colab挂载谷歌云盘colab使用命令&#xff08;从这开始看&#xff0c;前面no zuo no die)最紧要&#xff0c;首先&#xff0c;修改笔记本设置使用启用gpu![在这里插入图片描述](https://img-blog.csdnimg.cn/591a6c…

NAS层协议栈学习笔记

NAS(Non-Access Stratum)是无线网络中非接入层及包括移动性管理(MM)和会话管理(SM)协议 &#xff0c;在5G(NR)系统中连接管理(Connection Management)用于建立和释放UE与AMF之间的控制面(CP)信令连接。 5G中移动性管理是通过NAS信令在UE与核心网之间进行交互的&#xff0c;连接…

SpringBoot——静态资源及原理

优质博文&#xff1a;IT-BLOG-CN 一、使用 SpringBoot 的步骤 【1】创建SpringBoot应用&#xff0c;选中自己需要的模块。 【2】SpringBoot已经默认将这些场景配置好&#xff0c;只需要在配置文件中指定少量配置就可以运行起来。 【3】编写业务逻辑代码。 二、自动配置原理 …

面试鸭 - 专注于面试刷题的网站

网上面试题有很多&#xff0c;但此套面试题真实、原创、高频&#xff0c;全网最强。 题目涵盖大中小公司&#xff0c;真实靠谱&#xff0c;有频率和难度的标记&#xff0c;助你成为Offer收割机。 面试鸭地址&#xff1a;https://mianshiya.skyofit.com/ 本套题是我原创&…

vue3自定义hooks

获取dom的id属性 index.ts import { onMounted } from "vue" type option {el: string }export default function(option:option):Promise<{name: string}> {return new Promise((resolve)>{onMounted(()>{const dom:HTMLElement document.querySele…

Chrome添加扩展程序

Crx4Chrome 下载crx 打开扩展程序 如果拖动crx文件到扩展程序提示只能通过Chrome应用商店添加此项内容 修改crx文件后缀为zip并解压&#xff0c;再拖动到扩展程序

Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)

文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数 在没有用到choices参数之前&#xff0c;我们在D…

UI原型图

最近没啥项目&#xff0c;闲来无事&#xff0c;研究了一下原型图&#xff0c;万一以后年龄大了&#xff0c;代码敲不动还可以画画原型图&#xff0c;嘿嘿嘿 今天研究了两款画原型图的工具&#xff0c;即时设计-即时设计 - 可实时协作的专业 UI 设计工具 MODAO-墨刀 两款工具…

Flink 运行架构和核心概念

Flink 运行架构和核心概念 几个角色的作用&#xff1a; 客户端&#xff1a;提交作业JobManager进程 任务管理调度 JobMaster线程 一个job对应一个JobMaster 负责处理单个作业ResourceManager 资源的分配和管理&#xff0c;资源就是任务槽分发器 提交应用&#xff0c;为每一个…

基于PHP的纺织用品商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的纺织用品商城系统 一 介绍 此纺织用品商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。用户可注册登录&#xff0c;购物下单&#xff0c;评论等。管理员登录后台可对纺织用品&#xff0c;用户&#xf…

Redis篇---第十篇

系列文章目录 文章目录 系列文章目录前言一、怎么提高缓存命中率&#xff1f;二、Redis 如何解决 key 冲突&#xff1f;三、Redis 报内存不足怎么处理&#xff1f; 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分…

String的intern方法

String类的intern()方法在 Java 中是一个用于获取字符串常量的方法。当调用intern()方法时&#xff0c;它会将当前字符串添加到 Java 虚拟机中的常量池&#xff08;stringtable&#xff09;中&#xff0c;并返回指向该常量的引用。常量池是 Java 系统级别提供的缓存&#xff0c…

循环神经网络RNN完全解析:从基础理论到PyTorch实战

一、循环神经网络全解 1.1 什么是循环神经网络 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类具有内部环状连接的人工神经网络&#xff0c;用于处理序列数据。其最大特点是网络中存在着环&#xff0c;使得信息能在网络中进行循环&#xff0c;实现…

CXL崛起:2024启航,2025年开启新时代

在2019年&#xff0c;Intel主导联合多家阿里巴巴、Facebook(也就是改名后Meta)、谷歌、Dell、华为、思科、微软、HPE最初的八巨头&#xff0c;发布了新的互联协议CXL&#xff0c;全称Comupte Express Link。由于在服务器领域享有绝对领导地位&#xff0c;Intel一经号令&#xf…

Python调用企微机器人: 发送常用格式汇总

企微接口文档 发送应用消息 - 接口文档 - 企业微信开发者中心 发送格式 应用支持推送文本、图片、视频、文件、图文等类型。 ~~~以下列举常用格式 示例~~~ 1.发送文本 代码如下&#xff1a; def sendtxt_robotmsg(self):# 正式keywx_key "xx"wx_webhookurl htt…