C#数组:一维数组,二维数组、交错数组、数组复制

在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/147555.shtml

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

相关文章

关于新版的Maven创建Maven项目的时候只有Maven Archetype,而找不到Maven的这个问题

问题情况 : 在最近的学习过程中&#xff0c;想要创建一个Maven模块用于分块设计&#xff0c;但是在idea里面创建Maven项目的时候&#xff0c;发现与maven相关的只有Maven Archetype这个模块&#xff0c;然后找不到单纯的Maven模块&#xff1b;就像下面这样 : 解决方案 : 其…

大数据Doris(二十五):数据导入演示和其他导入案例

文章目录 数据导入演示和其他导入案例 一、数据导入演示

设计模式 - 六大设计原则(1)

六大设计原则 1、单一职责原则 特点&#xff1a; 类和方法属性等&#xff0c;都应当遵守单一职责。尽可能保持统一性&#xff0c;单一性。 含义&#xff1a; &#xff08;1&#xff09;统一性&#xff0c;定义一个模块就必须要符合所有对象的行为特征。比如声明一个 Animal 类…

【每日一题】—— C. Yarik and Array(Codeforces Round 909 (Div. 3))(贪心)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

【STM32】RTC(实时时钟)

1.RTC简介 本质&#xff1a;计数器 RTC中断是外部中断&#xff08;EXTI&#xff09; 当VDD掉电的时候&#xff0c;Vbat可以通过电源--->实时计时 STM32的RTC外设&#xff08;Real Time Clock&#xff09;&#xff0c;实质是一个 掉电 后还继续运行的定时器。从定时器的角度…

科技创新 共铸典范 | 江西卫健办邓敏、飞图影像董事长洪诗诗一行到访拓世科技集团,提振公共卫生事业发展

2023年11月15日&#xff0c;拓世科技集团总部迎来了江西省卫健项目办项目负责人邓敏、江西飞图影像科技有限公司董事长洪诗诗一行的考察参观&#xff0c;集团董事长李火亮、集团高级副总裁方高强进行热情接待。此次多方交流&#xff0c;旨在共同探讨携手合作&#xff0c;激发科…

2023年11月12日阿里云产品全面故障的启示

2023年11月12日&#xff0c;阿里云产品因为某些故障&#xff0c;全线都受到影响。是的&#xff0c;双十一的第二天&#xff0c;我的购物车还没清空&#xff0c;阿里云就不让我买了。云产品全面故障&#xff0c;影响之大一个大铁锅都装不下。之所以阿里云故障受到大家这么关注&a…

ClickHouse建表优化

1. 数据类型 1.1 时间字段的类型 建表时能用数值型或日期时间型表示的字段就不要用字符串&#xff0c;全String类型在以Hive为中心的数仓建设中常见&#xff0c;但ClickHouse环境不应受此影响。 虽然ClickHouse底层将DateTime存储为时间戳Long类型&#xff0c;但不建议存储Long…

【Java】ArrayList和LinkedList使用不当,性能差距会如此之大!

文章目录 前言源码分析ArrayList基本属性初始化新增元素删除元素遍历元素 LinkedList实现类基本属性节点查询新增元素删除元素遍历元素 分析测试 前言 在面试的时候&#xff0c;经常会被问到几个问题&#xff1a; ArrayList和LinkedList的区别&#xff0c;相信大部分朋友都能回…

自动化网络图软件

由于 IT 系统的发展、最近向混合劳动力的转变、不断变化的客户需求以及其他原因&#xff0c;网络监控变得更加复杂。IT 管理员需要毫不费力地可视化整个网络基础设施&#xff0c;通过获得对网络的可见性&#xff0c;可以轻松发现模式、主动排除故障、确保关键设备可用性等。 为…

SEnet注意力机制(逐行代码注释讲解)

目录 ⒈结构图 ⒉机制流程讲解 ⒊源码&#xff08;pytorch框架实现&#xff09;及逐行解释 ⒋测试结果 ⒈结构图 左边是我自绘的&#xff0c;右下角是官方论文的。 ⒉机制流程讲解 通道注意力机制的思想是&#xff0c;对于输入进来的特征层&#xff0c;我们在每一个通道学…

阿里云+宝塔部署项目(Java+React)

阿里云服务器宝塔面板部署项目&#xff08;SpringBoot React&#xff09; 1. 上传所需的文件到服务器 比如jdk包和java项目的jar&#xff1a;这里以上传jar 为例&#xff0c;创建文件夹&#xff0c;上传文件&#xff1b; 在创建的文件夹下上传jar包 上传jdk 2. 配置jdk环境 3.…

OpenAI 解雇了首席执行官 Sam Altman

Sam Altman 已被 OpenAI 解雇&#xff0c;原因是担心他与董事会的沟通和透明度&#xff0c;可能会影响公司的发展。该公司首席技术官 Mira Murati 将担任临时首席执行官&#xff0c;但 OpenAI 可能会从科技行业寻找新的首席执行官来领导未来的产品开发。Altman 的解雇给 OpenAI…

实验(二):存储器实验

一、实验内容与目的 实验要求&#xff1a; 利用 CP226 实验仪上的 K16..K23 开关做为 DBUS 的数据&#xff0c;其它开关做为控制信号&#xff0c;实现主存储器 EM 的读写操作&#xff1b;利用 CP226 实验仪上的小键盘将程序输入主存储器 EM&#xff0c;实现程序的自动运行。 实…

Gem5模拟器学习之旅——翻译自官网

文章目录 安装并使用gem5 模拟器支持的操作系统和环境依赖在 Ubuntu 22.04 启动(gem5 > v21.1)Docker获取代码用 SCons 构建用法首次构建 gem5gem5 二进制类型调试opt快速 常见错误错误的 gcc 版本Python 位于非默认位置未安装 M4 宏处理器Protobuf 3.12.3 问题 安装并使用g…

如何零基础自学AI人工智能

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;越来越多的有志之士被其强大的潜力所吸引&#xff0c;希望投身其中。然而&#xff0c;对于许多零基础的人来说&#xff0c;如何入门AI成了一个难题。本文将为你提供一份详尽的自学AI人工智能的攻略&#xff0c;帮…

如何理解IOC中的反射操作

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;是一种设计模式&#xff0c;其中控制流程的一部分由框架负责&#xff0c;而不是由应用程序代码直接控制。在IoC容器中&#xff0c;反射&#xff08;Reflection&#xff09;是一种机制&#xff0c;用于在运…

Idea 创建 Spring 项目(保姆级)

描述信息 最近卷起来&#xff0c;系统学习Spring&#xff1b;俗话说&#xff1a;万事开头难&#xff1b;创建一个Spring项目在网上找了好久没有找到好的方式&#xff1b;摸索了半天产出如下文档。 在 Idea 中新建项目 填写信息如下 生成项目目录结构 pom添加依赖 <depende…

ubuntu18.04中代码迁移到20.04报错

一、 PCL库&#xff0c;Eigen库报错&#xff0c;如&#xff1a; /usr/include/pcl-1.10/pcl/point_types.h:903:29: error: ‘enable_if_t’ in namespace ‘std’ does not name a template type; did you mean ‘enable_if’?/usr/include/pcl-1.10/pcl/point_types.h:698:…

修改 jar 包中的源码方式

在我们开发的过程中&#xff0c;我们有时候想要修改jar中的代码&#xff0c;方便我们调试或或者作为生产代码打包上线&#xff0c;但是在IDEA中&#xff0c;jar包中的文件都是read-only&#xff08;只读模式&#xff09;。那如何我们才能去修改jar包中的源码呢&#xff1f; 1.…