C#中数组与列表,集合等的联系

C#中,所有数组都自动继承于System.Array这个抽象类,数组都为引用类型,

所有对数组的更新都会导致源数组的元素值的篡改。

而所有集合的根都来自可枚举接口IEnumerable

数组有三种样式:

数组的Rank(秩)属性代表数组的维数

一维数组【Rank为1】:

T[] array;

锯齿数组【Rank为1】:

锯齿数组本质仍属于一维数组,只不过数组的某一个元素都是数组:

T[][] array;

多维数组【Rank为2~N,秩为逗号个数+1】:

二维,三维等多维数组,使用[,,..,]标识

T[,] array;

数组实现了IList,ICollection等接口,因此数组是一种特殊的集合

所有集合的根都来自可枚举接口IEnumerable

using System.Runtime.InteropServices;namespace System.Collections
{[ComVisible(true)][Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]public interface IEnumerable{[DispId(-4)]IEnumerator GetEnumerator();}
}

【数组一定是集合,集合不一定是数组】

public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable

部分数组ArraySegment<T>

一种结构,指代数组的一部分

ArraySegment<T>

public struct ArraySegment<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IReadOnlyList<T>, IReadOnlyCollection<T>

常见的集合统计:

列表:List<T>

列表:List<T> 继承于 IList<T>继承于ICollection<T>继承于IEnumerable<T>继承于IEnumerable

链表:LinkedList<T>

链表:LinkedList<T>继承于ICollection<T>继承于IEnumerable<T>继承于IEnumerable

字典:Dictionary<TKey, TValue>

字典:Dictionary<TKey, TValue>继承于IDictionary<TKey, TValue>继承于ICollection<KeyValuePair<TKey, TValue>>继承于IEnumerable<T>继承于IEnumerable

队列:Queue<T>

队列:Queue<T>继承于IEnumerable<T>继承于IEnumerable

栈:Stack<T>

栈:Stack<T>继承于IEnumerable<T>继承于IEnumerable

哈希集:HashSet<T>

哈希集:HashSet<T>继承于ISet<T>继承于ICollection<T>继承于IEnumerable<T>继承于IEnumerable

计算机中的集合与数学中的集合:

之前我们数学中定义的集合 集合中元素的三个特性:1、确定性、2、互异性、3、无序性。
在编程语言中,只有HashSet<T>继承于ISet<T> 满足,其他都不是数学中的集合,计算机中的集合是广义的概念,包含数组、队列、字典、列表等

测试程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CollectionAndArrayDemo
{class Program{static void Main(string[] args){TestArray();TestSegmentArray();TestCollections();Console.ReadLine();}/// <summary>/// 一维数据、锯齿数组、二维数组/// </summary>static void TestArray() {int[] oneDimensionalArray = new int[3] { 6, 9, 7 };Console.WriteLine(string.Join(",", oneDimensionalArray));Console.WriteLine($"一维数组的维数(秩)为【{oneDimensionalArray.Rank}】");int[][] sawtoothArray = new int[3][];sawtoothArray[0] = new int[2] { 1, 2 };sawtoothArray[1] = new int[3] { 1, 2, 3 };sawtoothArray[2] = new int[1] { 1 };Console.WriteLine(string.Join(".\n", sawtoothArray.Select(arr => string.Join(",", arr))));Console.WriteLine($"锯齿数组的维数(秩)为【{sawtoothArray.Rank}】");int[,] twoDimensionalArray = new int[3, 4] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };for (int i = 0; i <= twoDimensionalArray.GetUpperBound(0); i++){for (int j = 0; j <= twoDimensionalArray.GetUpperBound(1); j++){Console.Write($"{twoDimensionalArray[i, j]},");}Console.WriteLine();}Console.WriteLine($"二维数组的维数(秩)为【{twoDimensionalArray.Rank}】");int[,][] vs1 = new int[2, 3][];//定义一个二维数组,元素的每一个元素都是一个数组vs1[0, 0] = new int[3] { 4, 5, 6 };Console.WriteLine($"定义一个二维数组int[,][],元素的每一个元素都是一个数组.秩为【{vs1.Rank}】");int[][,] vs2 = new int[3][,];//定义一个一维数组,元素的每一个元素都是一个二维数组vs2[0] = new int[2, 3];Console.WriteLine($"定义一个一维数组int[][,],元素的每一个元素都是一个二维数组.秩为【{vs2.Rank}】");}/// <summary>/// 部分数组/// </summary>static void TestSegmentArray() {int[] srcArray = new int[6] { 6, 5, 4, 3, 2, 1 };ArraySegment<int> segmentArray = new ArraySegment<int>(srcArray, 2, 3);Console.WriteLine($"部分数组的元素个数【{segmentArray.Count}】");Console.WriteLine(string.Join(",", segmentArray));}/// <summary>/// 测试集合:列表、链表、字典、队列、栈/// </summary>static void TestCollections() {List<int> list = new List<int>() { 3, 6, 9 };Console.WriteLine($"打印列表:{string.Join(",", list)}");LinkedList<int> linkedList = new LinkedList<int>();LinkedListNode<int> node = new LinkedListNode<int>(5);linkedList.AddFirst(node);linkedList.AddAfter(node, 8);Console.WriteLine($"打印链表:{string.Join(",", linkedList)}");Dictionary<string, int> dict = new Dictionary<string, int>() { { "月清疏", 18 }, { "修吾", 3000 } };dict.Add("桑游", 19);dict["白茉晴"] = 16;Console.WriteLine($"打印字典:{string.Join(",", dict)}");//哈希集 元素是唯一的HashSet<int> hashSet = new HashSet<int>() { 20, 40 };hashSet.Add(20);hashSet.Add(30);Console.WriteLine($"打印哈希集:{string.Join(",", hashSet)}");//队列为先进先出Queue<int> queue = new Queue<int>(new int[] { 20, 35 });queue.Enqueue(29);int dequeueElement = queue.Dequeue();Console.WriteLine($"队列出列元素值:【{dequeueElement}】");Console.WriteLine($"打印队列:{string.Join(",", queue)}");//栈为后进先出Stack<int> stack = new Stack<int>(new int[] { 20, 35 });stack.Push(29);int popElement = stack.Pop();Console.WriteLine($"出栈元素值:【{popElement}】");Console.WriteLine($"打印栈:{string.Join(",", stack)}");}}
}

程序运行如图:

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

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

相关文章

软考高项总结:第20章高级项目管理

一、高级项目管理基础 1、项目组合主要是为实现战略目标而进行的多个项目。比如村里要发展经济。制定了一个发展战略。要修路,要建厂,要种树,要整田。这些方面都有很多项目,在一起形成了项目组合。 2、项目集中的项目之间存在着关联关系,要统一考虑以实现更大利益。比如…

OpenHarmony 实战开发——如何编译OpenHarmony自带APP

概述 OpenHarmony 的主干代码是开源社区的重要学习资源&#xff0c;对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源&#xff0c;在主干代码的 applications 目录里聚集了很多原生的应用实现&#xff0c;那么如何编译这些代码就是我们这篇文章的主要…

基于openEuler22.03 LTS环境的容器项目实训——分布式微服务项目部署

一、说明本文配置环境为VMware虚拟机(2核CPU,4 GB内存,40GB磁盘),OS为openEuler 22.03 LTS ,虚拟机要求能联网。二、安装docker环境2.1 安装docker相关软件包[root@node01 ~]# dnf -y install docker docker-compose2.2 查看docker版本[root@node01 ~]# docker version C…

中霖教育:税务师考试可以申请免试吗?

符合下列相应条件之一的&#xff0c;可报名参加税务师职业资格考试&#xff1a; 1.取得经济学、法学、管理学学科门类大学本科及以上学历(学位);或者取得其他学科门类大学本科学历&#xff0c;从事经济、法律相关工作满1年。 2.取得经济学、法学、管理学学科门类大学专科学历…

批量文本高效编辑神器:轻松拆分每行内容,一键保存更高效!轻松实现批量拆分与保存

文本处理成为我们日常工作中的一项重要任务。然而&#xff0c;面对大量的文本内容&#xff0c;传统的逐行编辑方式往往显得繁琐且效率低下。那么&#xff0c;有没有一种更高效、更便捷的解决方案呢&#xff1f;答案是肯定的——批量文本高效编辑神器&#xff0c;让您的文本处理…

css-页面布局-定位大解析-每文一言(世界上,没有人可以支持你一辈子)

&#x1f390;每文一言 世界上,没有人可以支持你一辈子 目录 &#x1f390;每文一言 &#x1f381;css定位 &#x1f9e7;静态定位 position: static &#x1f384;相对定位 position:relative &#x1f380;绝对定位 position:absolute &#x1f383;固定定位 position…

vue3专栏项目 -- 四、前后端结合(上)

一、前后端分离是什么 前面我们一直在和静态数据打交道&#xff0c;虽然流程可以跑个半通&#xff0c;但是静态数据还是给我们造成了诸多不便&#xff0c;现在我们是时候用上后端了。 现在的应用开发模式&#xff0c;自从SPA出现以后&#xff0c;前端和后端可以平行的进行对应…

软件测试之 单元测试

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 单元测试 在eclipse中 导包 放入提前准备的包 遇到这…

Python 中的 Lambda 函数:简单、快速、高效

大家好&#xff0c;今天再给大家介绍一个python的一个强大工具Lambda 函数&#xff0c;它允许你快速定义简单的匿名函数。这种函数是“匿名的”&#xff0c;因为它们不需要像常规函数那样被明确命名。 在本文中&#xff0c;我们将通过清晰的解释和实用的示例&#xff0c;深入了…

阮怀俊谈如何盘活和挖掘乡村文旅资源

近年来&#xff0c;浙江凭借高水平建设新时代美丽乡村&#xff0c;各项工作持续走在全国前列&#xff0c;最近&#xff0c;在国家发展改革委关于恢复和扩大消费措施的通知中也提到&#xff1a; “推广浙江‘千万工程’经验&#xff0c;建设宜居宜业和美乡村。实施文化产业赋能乡…

【RAG 论文】FiD:一种将 retrieved docs 合并输入给 LM 的方法

论文&#xff1a; Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering ⭐⭐⭐⭐ EACL 2021, Facebook AI Research 论文速读 在 RAG 中&#xff0c;如何将检索出的 passages 做聚合并输入到生成模型是一个问题&#xff0c;本文提出了一…

基于深度学习神经网络的AI图像PSD去雾系统源码

第一步&#xff1a;PSD介绍 以往的研究主要集中在具有合成模糊图像的训练模型上&#xff0c;当模型用于真实世界的模糊图像时&#xff0c;会导致性能下降。 为了解决上述问题&#xff0c;提高去雾的泛化性能&#xff0c;作者提出了一种Principled Synthetic-to-real Dehazing (…

人工智能轨道交通行业周刊-第79期(2024.4.22-5.12)

本期关键词&#xff1a;无人机巡检、车机联控、减速顶、Agent、GraphRAG、RAGFlow 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

MFC窗口更新与重绘

窗口更新与重绘 窗口或控件更新其外观的情况通常包括以下几种&#xff1a; 窗口大小变化&#xff1a; 当用户调整窗口大小时&#xff0c;窗口的客户区大小会改变&#xff0c;需要重新绘制窗口内容以适应新的大小。 窗口重叠或暴露&#xff1a; 当窗口被其他窗口遮挡部分或完…

作为校招新人,他们如何在字节跳动做 AI 研究并中选 ICLR 的?

校招生和实习生在字节跳动&#xff0c;工作一年就中选 ICLR 2024 &#xff0c;这是怎样一种体验&#xff1f; 就在 5 月 7 日至 5 月 11 日&#xff0c;2024 年度国际表征学习大会 ICLR 2024 在奥地利维亚纳举办。该活动是深度学习领域最重要的学术活动之一&#xff0c;由深度学…

pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面

pycharm 里面安装 codeium 插件的时候&#xff0c;不能够弹出登录界面 pycharm 里面安装 codeium 插件的时候&#xff0c;不能够弹出登录界面--解决如下A pycharm 里面安装 codeium 插件的时候&#xff0c;不能够弹出登录界面–解决如下 #踩坑/pycharm/codeium插件无法登录 安…

C脚本实现WIncc模拟量趋势窗口弹出

文章目录 前言一、步骤及解析二、运行画面演示三、总结 前言 本文给出了一种基于C脚本实现点击输入输出域对象&#xff0c;弹出对应模拟量趋势窗口的方法。 一、步骤及解析 在Wincc变量管理中&#xff0c;添加两个变量&#xff1b; 示例如下&#xff1a; 将以上两个变量添加到…

pikachu靶场(xss通关教程)

&#xff08;注&#xff1a;若复制注入代码攻击无效&#xff0c;请手动输入注入语句&#xff0c;在英文输入法下&#xff09; 反射型xss(get型) 1.打开网站 发现有个框&#xff0c;然后我们在框中输入一个“1”进行测试&#xff0c; 可以看到提交的数据在url处有显示&#xf…

阮怀俊参与五龙乡黄沙村村企联办“强村公司”

为走好海岛县高质量发展共同富裕特色之路&#xff0c;探索村级集体经济发展新路径、扶持新模式、运行新机制&#xff0c;嵊泗县五龙乡黄沙村股份经济合作社与杭州山舍乡建乡村产业发展有限责任公司联办成“强村公司”。 创始人阮怀俊表示&#xff0c;双方就融合乡域发展和文旅产…

【考研数学】汤家凤“免单“数学题被吐槽‘太难’,老汤回应「怎么还有脸笑」,网友:这些题有毒!

我看了汤家凤老师出的几道题&#xff0c;实际上对于考研的同学来说&#xff0c;确实是送分题 第一个是三角函数变换中的万能公式&#xff1b;第二个e^x的泰勒展开公式&#xff1b;第三个是第一类重要极限。只要复习过&#xff0c;那基本上都能正常做出来。 至于汤家凤老师说「…