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)}");
        }
    }
}

程序运行如图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业微信hook接口协议,ipad协议http,同步消息记录

同步消息记录 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信limit是int每次返回大小seq是int查询下标 请求示例 {"uuid":"ecb033af-6fcd-4ec2-880e-41f070b65eaf","limit":1000, "seq":1…

访客管理系统对于校园安全的重要性

校园访客办理计划是针对校园安全需求规划的安全办理体系&#xff0c;主要用于对校园外来人员的科学办理。要做好校园安全作业&#xff0c;把风险分子拒之门外尤为要害。校园访客办理计划实现访客实名制&#xff0c;并结合公安网、黑名单功用&#xff0c;对风险人员进行提前预警…

浅析vue3自定义指令

vue3中可以像下面这样使用自定义指令。 这里我们只是定义了一个vFoucs变量&#xff0c;vue怎么知道这是一个指令呢&#xff1f; 这是因为约定大于配置&#xff0c;vue3中有这样一个约定&#xff08;截图来自官方文档&#xff09;&#xff1a; 注意这里说的是驼峰命令&#x…

【class6】人工智能初步(选择一个合适的监督学习算法。)

【昨日内容复习】 进行监督学习时&#xff0c;第一个步骤是提取数据集的文本特征和对应的标签。 提取文本特征的具体步骤如下&#xff1a; STEP1. 构造词袋模型&#xff0c;提取数据集中的文本特征 STEP2. 使用toarray()函数&#xff0c;将X转换为一个NumPy数组&#xff0c;方…

初始化linux数据盘(3TB)分区-格式化-挂载目录

场景说明&#xff1a;某云给我们服务器加载了一块3TB的硬盘扩容&#xff08;没有直接扩&#xff0c;原因是原来的盘做的是mbr&#xff08;什么年代了&#xff0c;谁干的&#xff09;的分区&#xff0c;最大识别2TB&#xff09; 确认磁盘 输入命令lsblk 查看数据盘信息 &#…

PyQt5的多窗口设计

文章目录 步骤一步骤2步骤3步骤4步骤5完整的代码如下 步骤一 1.首先新建一个窗口&#xff0c;把对象名改为ParentWindow&#xff0c;然后保存&#xff0c;把.ui的名字改为Main_window.ui 步骤2 再新建一个窗口&#xff0c;把对象名改为ChildWindow1&#xff0c;然后保存&…

Python 旋转立方体

文章目录 效果图运行环境完整代码实现思路1. 导入库和定义常量2. 创建Cube类3. 实现Cube类的draw方法4. 实现主函数 效果图 运行环境 python版本&#xff1a;python3.x 依赖包&#xff1a; $ pip install pygame $ pip install numpy完整代码 import numpy as np # 导入 N…

【复试分数线】工科985历年分数线汇总(第三弹)

国家线 可以看作是考研上岸最最最基础的门槛。真正决定你能不能进入复试的还要看院线&#xff08;复试分数线&#xff09;&#xff01;今天我将分析考信号的5所工科类985近三年复试分数线&#xff0c;大家可以参考&#xff01;&#xff01; 分别是&#xff1a;①北京航空航天大…

k8s coredns配置

1.coredns可根据集群具体数量修改pod数&#xff0c;官方推荐比例为5/1&#xff0c;即有15台服务器最好是3个pod。 2.coredns会继承pod所在主机的dns解析,修改了主机的dns解析之后&#xff0c;coredns有一段时间的缓存&#xff0c;重启coredns才会在集群内部立刻生效该解析。 …

黑马甄选离线数仓项目day01(项目介绍)

课程介绍 项目名称 黑马甄选数仓形式 离线数仓开发业务类型 电商业务 电商介绍 B2B B2C C2C 项目属于 新零售电商 新零售 线上(网站,app,小程序&#xff09; 线下&#xff08;实体体验店&#xff09; 物流&#xff08;自营物流&#xff09; 项目行业 果蔬生鲜领域 商业模式 B…

[图解]实现领域驱动设计译文暴露的问题03

0 00:00:02,960 --> 00:00:04,940 前面我们讲了 1 00:00:05,260 --> 00:00:06,810 第①句话的 2 00:00:07,090 --> 00:00:09,750 第&#xff08;1&#xff09;个问题和第&#xff08;2&#xff09;个问题 3 00:00:13,920 --> 00:00:16,930 共享父类的对象&#…

【代码随想录算法训练Day5】今天休息,复盘总结

Day5 休息日 时机恰到好处&#xff0c;刚好学习完了数组和链表&#xff0c;从代码随想录里扒了两张总结图来&#xff0c;这就是这几天里我们一起解决的问题&#xff0c;如果以后忘了&#xff0c;还有问题&#xff0c;先回到这里&#xff0c;只看思维导图&#xff0c;还能想起来…

WordPress 管理员密码重置方法汇总

最近明月碰到一个 WordPress 站长求助咨询&#xff0c;说是自己 WordPress 站点的管理员密码被恶意篡改了&#xff0c;对 WordPress 了解的都知道这一般都是恶意代码造成的&#xff0c;问题大多出在使用了所谓的破解版、去授权版的插件或者主题被植入了恶意代码、后门木马。明月…

【目标检测论文解读复现NO.38】基于改进YOLOv8模型的轻量化板栗果实识别方法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

革新机器人任务规划:TREE-PLANNER引领高效、准确的机器人动作生成新趋势

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言 任务规划在机器人技术中扮演着至关重要的角色。它涉及到为机器人设计一系列中级动作&#xff08;技能&#xff09;&#xff0c;使其能够完成复杂的高级任…

网络基础(三)——网络层

目录 IP协议 1、基本概念 2、协议头格式 2.1、报头和载荷如何有效分离 2.2、如果超过了MAC的规定&#xff0c;IP应该如何做呢&#xff1f; 2.3、分片会有什么影响 3、网段划分 4、特殊的ip地址 5、ip地址的数量限制 6、私有ip地址和公网ip地址 7、路由 IP协议 网络…

C语言/数据解构——(随即链表的复制)

一.前言 嗨嗨嗨&#xff0c;大家好久不见。已经有好几天没更新了。今天我们就分享一道链表题吧——随即链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer废话不多说&#xff0c;让我们直接开始今天的题目分享吧。 二.正文 1.1题目描述 他和单链表不同…

Java入门最小必要知识:变量及其本质

编程语言是与计算机交流的桥梁&#xff0c;而在编程世界中&#xff0c;变量是这座桥上不可或缺的砖石。 从本质上&#xff0c;可以把复杂的编程工作简化为两件事&#xff1a; ①定义变量②操作变量 可见&#xff0c;变量之于编程的重要性。 对于Java开发者&#xff0c;理解…

自动土壤墒情监测仪

TH-GTS04随着科技的快速发展&#xff0c;自动土壤墒情监测仪已成为现代农业、园林、城市绿化等领域不可或缺的重要工具。其中&#xff0c;管式土壤墒情监测仪以其独特的优势&#xff0c;受到了广大用户的青睐。本文将详细阐述管式土壤墒情监测仪的优势&#xff0c;以便读者更好…

【AI+漫画】程序员小李解决疑难杂症BUG的日常

周末花了点时间制作的AI漫画。 感慨一句&#xff0c;程序人生, 相伴随行。 原文链接&#xff1a;【AI漫画】程序员小李解决疑难杂症BUG的日常