c#基础08(数组)

news2025/6/3 1:14:45

文章目录

    • 数组
      • 数组概念
      • 声明数组
      • 初始化数组
      • 赋值给数组
      • 访问数组元素
    • 集合
      • 动态数组(ArrayList)
      • 使用foreach循环
      • C#数组细节
        • 多维数组
        • 传递数组给函数
        • 参数数组

数组

数组概念

数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。

所有的数组都是由连续的内存位置组成的。最低的地址对应第一个于难诉,最高的地址对应最后一个元素。

声明数组

语法:

datatype[] arrayName;
  • datatype 用于指定被存储在数组中的元素的类型。

  • [ ] 指定数组的秩(维度)。秩指定数组的大小。

  • arrayName 指定数组的名称。

例如:

double[] arr;

初始化数组

声明一个数组不会在内存中初始化数组。当初始化数组变量时,您可以赋值给数组。

数组是一个引用类型,所以您需要使用 new 关键字来创建数组的实例。

示例:

double[] arr = new double[10];

赋值给数组

您可以通过使用索引号赋值给一个单独的数组元素,比如:

double[] arr = new double[10];
arr[0] = 6.66;

您可以在声明数组的同时给数组赋值,比如:

double[] arr = {2.03,6.99,66.6};

您也可以创建并初始化一个数组,比如:

int[] buf = new int[2]{20,30};

在上述情况下,你也可以省略数组的大小,比如:

int[] buf = new int[]{5,54,95,421};

当您创建一个数组时,C# 编译器会根据数组类型隐式初始化每个数组元素为一个默认值。例如,int 数组的所有元素都会被初始化为 0。

访问数组元素

元素是通过带索引的数组名称来访问的。

例如:

int a = arr[1];
int b = arr[2];
//更改数组的值
arr[3] = 5;
//循环遍历数组
for(int i =0 ;i < arr.length;i++)
{
    //打印数组的值到控制台
    Console.WriteLine(arr[i]);
}

示例:

static void Main(string[] args)
{
    int[] n = new int[10];
    int i,j;
    
    //初始化数组n中的元素
    for(i = 0;i < 10;i++)
    {
        n[i] = i + 100;
    }
    
    //输出每个数组元素的值
    for(j = 0;j < 10;j++)
    {
        Console.WriteLine($"{j},{n{j}}");
        Console.ReadKey();
    }
}

集合

集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。

集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建 Object 类的对象的集合。在 C# 中,Object 类是所有数据类型的基类。

各种集合类和它们的用法

描述和用法
动态数组(ArrayList)它代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。
哈希表(Hashtable)它使用来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键值对。键用于访问集合中的项目。
排序列表(SortedList)它可以使用索引来访问列表中的项。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。
堆栈(Stack)它代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。
队列(Queue)它代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队
点阵列(BitArray)它代表了一个使用值 1 和 0 来表示的二进制数组。当您需要存储位,但是事先不知道位数时,则使用点阵列。您可以使用整型索引从点阵列集合中访问各项,索引从零开始。

动态数组(ArrayList)

动态数组(ArrayList)代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。

ArrayList 类的方法和属性

下表列出了 ArrayList 类的一些常用的 属性

属性描述
Capacity获取或设置 ArrayList 可以包含的元素个数。
Count获取 ArrayList 中实际包含的元素个数。
IsFixedSize获取一个值,表示 ArrayList 是否具有固定大小。
IsReadOnly获取一个值,表示 ArrayList 是否只读。
IsSynchronized获取一个值,表示访问 ArrayList 是否同步(线程安全)。
Item[Int32]获取或设置指定索引处的元素。
SyncRoot获取一个对象用于同步访问 ArrayList。

下表列出了 ArrayList 类的一些常用的 方法

序号方法&描述
1public virtual int Add( object value ); 在 ArrayList 的末尾添加一个对象。
2public virtual void AddRange( ICollection c ); 在 ArrayList 的末尾添加 ICollection 的元素。
3public virtual void Clear(); 从 ArrayList 中移除所有的元素。
4public virtual bool Contains( object item ); 判断某个元素是否在 ArrayList 中。
5public virtual ArrayList GetRange( int index, int count ); 返回一个 ArrayList,表示源 ArrayList 中元素的子集。
6public virtual int IndexOf(object); 返回某个值在 ArrayList 中第一次出现的索引,索引从零开始。
7public virtual void Insert( int index, object value ); 在 ArrayList 的指定索引处,插入一个元素。
8public virtual void Remove( object obj ); 从 ArrayList 中移除第一次出现的指定对象。

示例:

static void Main(string[] args)
{
    ArrayList al = new ArrayList();
    Console.WriteLine("添加元素");
    al.Add(45);
    al.Add(10);
    al.Add(2);
    al.Add(4);
    al.Add(90);
    
    Console.WriteLine("数组容量{0}",al.Capacity);
    Console.WriteLine("实际个数{0}",al.Count);
    
    foreach(int i in al)
    {
        Console.WriteLine(i);
    }
    al.Sort();
}

使用foreach循环

在前面的实例中,我们使用一个 for 循环来访问每个数组元素。您也可以使用一个 foreach 语句来遍历数组。

示例:

static void Main(string[] args)
{
    ArrayList arr = new ArrayList();
    arr.Add(2);
    arr.Add(40);
    arr.Add(20);
    arr.Add(25);
    arr.Add(58);
    arr.Add(23);
    Console.WriteLine("动态数组的容量为:{0}",arr.Capacity);
    Console.WriteLine("动态数组的实际元素个数为:{0}",arr.Count);

    //遍历数组
    foreach (int i in arr)
    {
        Console.WriteLine(i);

    }

    //排序
    arr.Sort();

    foreach (int i in arr)
    {
        Console.WriteLine(i);
    }

}

在这里插入图片描述

C#数组细节

在 C# 中,数组是非常重要的,且需要了解更多的细节。下面列出了 C# 程序员必须清楚的一些与数组相关的重要概念:

概念描述
多维数组C# 支持多维数组。多维数组最简单的形式是二维数组。
传递数组给函数您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。
参数数组这通常用于传递未知数量的参数给函数。
多维数组

c#支持多维数组,多维数组又称为矩形数组

示例:

string[,] names;//二维数组
int [,,] m;//三维数组

二维数组

初始化

int[,] a = new int[3,4]
{
    {0,1,2,3},
    {4,5,6,7},
    {8,9,10,11}
};

访问二维数组元素

二维数组中的元素是通过使用下表(即数组的行索引和列索引)来访问的。

int val = a[2,3];
static void Main(string[] args)
{
    int[,] a = new int[5,2]{{0,0},{1,2},{2,4},{3,6},{4,8}};
	int i,j;
    
    //输出数组中每个元素的值
    for(i = 0;i < 5;i++)
    {
        for(j = 0;j < 2;j++)
        {
            Console.WriteLine(a[i,j]);
        }
    }
    Console.ReadKey();
}	
传递数组给函数

在 C# 中,您可以传递数组作为函数的参数。您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。

public static double getAverage(int[] arr,int size)
{
    int i;
    double avg;
    int sum = 0;
    
    for(i = 0;i < size;i++)
    {
        sum += arr[i];
    }
    
    avg = (double)sum/size;
    return avg;
}

static void Main(string[] args)
{
    MyArray app = new MyArray();
    int[] balance = new int[]{1000,2,3,10,50};
    double avg;
    
    avg = getAverage(balance,5);
    
    Console.WriteLine(avg);
    Console.ReadKey();
    
    
}
参数数组

有时,当声明一个方法时,您不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。

params关键字

在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。params 的使用格式为:

public 返回类型 方法名称( params 类型名称[] 数组名称 )
public static int AddElements(params int[] arr)
{
    int sum = 0;
    foreach(int i in arr)
    {
        sum += i;
        
    }
    
    return sum;
    
    
}


static void Main(string[] args)
{
    ParamArray app = new ParamArrray();
    int sum = app.AddElements(512,720,250,567,889);
    Console.WriteLine(sum);
    Console.ReadKey();
}

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

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

相关文章

嵌入式学习--江协stm32day3

这是我目前为止认为最重要的模块--TIM定时器&#xff0c;这里我们主要学习通用定时器 最小的计数计时单元为时基单元&#xff0c;包括PSC&#xff0c;ARR&#xff0c;CNT CK_PSC&#xff08;Prescaler&#xff0c;预分频器&#xff09;&#xff1a;作用是对输入时钟信号进行分…

4.8.1 利用Spark SQL实现词频统计

在利用Spark SQL实现词频统计的实战中&#xff0c;首先需要准备单词文件并上传至HDFS。接着&#xff0c;可以通过交互式方法或创建Spark项目来实现词频统计。交互式方法包括读取文本文件生成数据集&#xff0c;扁平化映射得到新数据集&#xff0c;然后将数据集转成数据帧&#…

PyTorch中nn.Module详解

直接print(dir(nn.Module))&#xff0c;得到如下内容&#xff1a; 一、模型结构与参数 parameters() 用途&#xff1a;返回模块的所有可训练参数&#xff08;如权重、偏置&#xff09;。示例&#xff1a;for param in model.parameters():print(param.shape)named_parameters…

动态表单开发避坑:改变input的值不会触发change事件即时修复策略-WdatePicker ——仙盟创梦IDE

原始传统模式 onchange <input onchange"未来之窗东方仙盟change(this)" oni > <script>function 未来之窗东方仙盟change(onj){console.log("未来之窗东方仙盟change",onj.value)} </script> 测试 原始传统模式 oninput <input …

10.安卓逆向2-frida hook技术-frida基本使用-frida指令(用于hook)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

动态设置微信小程序页面标题(navigationBarTitleText属性)

前言&#xff1a; 最近在公司进行小程序研发的时候&#xff0c;产品给出了一个动态加载页面标题的需求&#xff0c;经过调研之后将结果在这里与各位伙伴进行分享。 代码展示&#xff1a; 在.json文件中进行初始配置&#xff1a; { "usingComponents": {}, &q…

Flutter下的一点实践

目录 1、背景2、refena创世纪代码3、localsend里refena的刷新3.1 初始状态3.2 发起设备扫描流程3.3 扫描过程3.3 刷新界面 4.localsend的设备扫描流程4.1 UDP广播设备注册流程4.2 TCP/HTTP设备注册流程4.3 localsend的服务器初始化工作4.4总结 1、背景 在很久以前&#xff0c;…

VScode ios 模拟器安装cocoapods

使用 Homebrew 安装&#xff08;推荐&#xff09; 如果你有 Homebrew&#xff0c;直接用它安装更稳定&#xff1a; brew install cocoapods

Redis最佳实践——安全与稳定性保障之数据持久化详解

Redis 在电商应用的安全与稳定性保障之数据持久化全面详解 一、持久化机制深度解析 1. 持久化策略矩阵 策略触发方式数据完整性恢复速度适用场景RDB定时快照分钟级快容灾备份/快速恢复AOF实时追加日志秒级慢金融交易/订单关键操作混合模式RDBAOF同时启用秒级中等高安全要求场…

K 值选对,准确率翻倍:KNN 算法调参的黄金法则

目录 一、背景介绍 二、KNN 算法原理 2.1 核心思想 2.2 距离度量方法 2.3 算法流程 2.4算法结构&#xff1a; 三、KNN 算法代码实现 3.1 基于 Scikit-learn 的简单实现 3.2 手动实现 KNN&#xff08;自定义代码&#xff09; 四、K 值选择与可视化分析 4.1 K 值对分类…

技术栈ES的介绍和使用

目录 1. 全文搜索引擎&#xff08;Elastic Search&#xff09;的由来2. Elastic Search 概述2.1 Elastic Search 介绍2.2 Elastic Search 功能2.3 Elastic Search 特点 3. 安装 Elastic Search3.1 ES 的安装3.2 安装 kibana3.3 ES 客户端的安装 4. Elastic Search 基本概念4.1 …

Windows版本的postgres安装插件http

1、下载安装包 这里使用安装 pgsql-http 的扩展 源码地址&#xff1a;GitHub - pramsey/pgsql-http: HTTP client for PostgreSQL, retrieve a web page from inside the database. 编译的安装地址&#xff1a;http extension for windows updated to include PostgreSQL17 …

uni-app学习笔记十六-vue3页面生命周期(三)

uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload&#xff1a;用于监听页面卸载。 当页面被关闭时&#xff0c;即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4&#xff0c;在demo4页面回退不了到d…

优化的两极:凸优化与非凸优化的理论、应用与挑战

在机器学习、工程设计、经济决策等众多领域&#xff0c;优化问题无处不在。而在优化理论的世界里&#xff0c;凸优化与非凸优化如同两个截然不同的 “王国”&#xff0c;各自有着独特的规则、挑战和应用场景。今天&#xff0c;就让我们深入探索这两个优化领域的核心差异、算法特…

(五)MMA(OpenTelemetry/Rabbit MQ/ApiGateway/MongoDB)

文章目录 项目地址一、OpenTelemetry1.1 配置OpenTelemetry1. 服务添加2. 添加服务标识3. 添加请求的标识4. 添加中间价 二、Rabbit MQ2.1 配置Rabbit MQ1. docker-compose2. 添加Rabbit MQ的Connect String 2.2 替换成Rabbit MQ1. 安装所需要的包2. 使用 三、API Gateways3.1 …

TCP通信与MQTT协议的关系

1. MQTT 处理核心&#xff08;Mqtt_Pro&#xff09; void Mqtt_Pro(void) { MQTT_Init(); // 初始化MQTT协议栈&#xff08;连接参数、缓冲区等&#xff09; MQTT_SendPro(); // 处理MQTT发送&#xff08;封装消息&#xff0c;调用TCP发送&#xff09; MQTT_RecPro();…

Jetson Orin Nano - SONY imx415 camera驱动开发

目录 前言: 调试准备工作: 修改内核默认打印等级 一、imx415驱动开发 1、硬件接线 2、设备树修改 2.1 创建 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 文件 2.2 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 添加到设备树 2.3 编译设备树 3、imx415驱动…

word为跨页表格新加表头和表名

问题&#xff1a; 当表格过长需要跨页时&#xff08;如下图所示&#xff09;&#xff0c;某些格式要求需要转页接排加续表。 方法一&#xff1a; 1、选中表格&#xff0c;在“表布局”区域点开“自动调整”&#xff0c;选择“固定列宽”&#xff08;防止后续拆分表格后表格变…

测试用例篇章

本节概要&#xff1a; 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 一、测试用例 1.1 概念 什么是测试用例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包含&#xff1a;测…

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 一、流量分析 题目没有任何提示,附件gzl.pcap 解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1 测试链接…