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

news2024/11/28 4:51:55

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.coloradmin.cn/o/1668564.html

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

相关文章

纯血鸿蒙APP实战开发——Grid和List内拖拽交换子组件位置

Grid和List内拖拽交换子组件位置 介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子…

【数据结构】环状链表OJ题

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 一、OJ 环形链表&#xff1a; 快慢指针即可解决问题: 2情况&#xff1a; 快指针走到结尾&#xff08;不是环&#xff09;快指针和尾指针相遇&#xff08;是环的&#xff09; …

macos使用yarn创建vite时出现Usage Error: The nearest package directory问题

步骤是macos上使用了yarn create vite在window上是直接可以使用了yarn但是在macos上就出现报错 我们仔细看&#xff0c;它说的If /Users/chentianyu isnt intended to be a project, remove any yarn.lock and/or package.json file there.说是要我们清除yarn.lock和package.js…

OGG几何内核-网格化的改进

OGG社区于4月19日发布了OGG 1.0 preview版本。相对于OCCT 7.7.0有很多改进&#xff0c;目前在持续研究中。最近测试了一下网格化&#xff0c;确实有很好的改进。对比展示如下&#xff1a; 几何内核&#xff1a; OGG 1.0 preview 几何内核&#xff1a;OCCT 7.7.0 采用OCCT几何内…

线程同步--条件变量,信号量

生产者和消费者模型 案例 /*生产者消费者模型&#xff08;粗略的版本&#xff09; */ #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h>// 创建一个互斥量 pthread_mutex_t mutex;struct Node{int num;struct Node …

【ALM】ALM解决方案系列:质量保证

1软件的质量管理现状与痛点 在软件开发中&#xff0c;质量被视为软件产品的生命。保证软件质量&#xff0c;是贯穿整个软件生命周期的重要问题。如果在软件开发早期忽视质量管理&#xff0c;会导致软件项目管理出现问题。因此&#xff0c;重视并规范软件管理在软件项目管理中起…

[论文笔记]Corrective Retrieval Augmented Generation

引言 今天带来论文Corrective Retrieval Augmented Generation的笔记&#xff0c;这是一篇优化RAG的工作。 大型语言模型(LLMs) inevitable(不可避免)会出现幻觉&#xff0c;因为生成的文本的准确性不能仅仅由其参数化知识来确保。尽管检索增强生成(RAG)是LLMs的一个可行补充…

带你手撕红黑树! c++实现 带源码

目录 一、概念 二、特性 三、接口实现 1、插入 情况一&#xff1a;p为黑&#xff0c;结束 情况二&#xff1a;p为红 1&#xff09;叔叔存在且为红色 2&#xff09;u不存在/u存在且为黑色 &#xff08;1&#xff09;p在左&#xff0c;u在右 &#xff08;2&#xff09;…

【半夜学习MySQL】表的约束(含主键、唯一键、外键、zerofill、列描述、默认值、空属性详解)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 前言空属性默认值列描述zerofill主键主键概述主键删除与追加复合主键 自增长唯一键外键综合案例 前言 上一篇文章中介绍了数…

Vue3项目打包部署到云服务器的Nginx中

文章目录 一、打包vue3项目二、dist文件夹上传到服务器三、改nginx配置文件Docker安装nginx 一、打包vue3项目 npm run build 二、dist文件夹上传到服务器 将dist文件夹放到docker安装的nginx中的html目录下 三、改nginx配置文件 然后重启nginx【改了配置文件重启nginx才能…

JVM的原理与性能

1 JVM 内存结构 1.1 运行时数据区 1.1.1 栈&#xff08;虚拟机栈&#xff09; 每个线程在创建时都会创建一个私有的Java虚拟机栈&#xff0c;在执行每个方法时都会打包成一个栈帧&#xff0c;存储了局部变量表、操作数栈、动态链接、方法出口等信息&#xff0c;然后放入栈中。…

关于我转生从零开始学C++这件事:获得神器

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 几天不见 &#xff0c;甚是想念&#xff01;哈咯大家好又是我大伟&#xff0c;五一的假期已经结束&#xff0…

rt-thread 挂载romfs与ramfs

参考&#xff1a; https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/qemu-network/filesystems/filesystems?id%e4%bd%bf%e7%94%a8-romfs https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutor…

实操Linux磁盘管理(分区、格式化、挂载)

在Linux系统中&#xff0c;磁盘管理是一个必学的知识点。正确地进行磁盘分区、格式化和挂载可以确保我们能够充分利用磁盘空间并高效地存储和访问数据。 相比于Windows系统中的简单盘符管理&#xff0c;Linux中的磁盘管理更加复杂且灵活。在Linux系统中&#xff0c;一切设备都…

一款简易的免费抽奖软件

一、介绍 这款抽奖软件设计简洁&#xff0c;操作便捷。用户可以轻松将参与名单通过EXCEL文件导入至程序中&#xff0c;并可根据需要设定各类奖品和对应的中奖人数。在选定了奖品后&#xff0c;用户只需点击“开始”按钮&#xff0c;随后再按下“暂停”按钮&#xff0c;软件便会…

C++/Qt 小知识记录6

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识6 dumpbin工具查看库导出符号OSGEarth使用编出的protobuf库&#xff0c;报错问题解决VS2022使用cpl模板后&#xff0c;提示会乱码的修改设置QProcess调用cmd.exe执行脚本QPainterPath对线段描边处理…

pycharm本地文件更新至虚拟机

tools–>deployment–>configuration root path的路径要跟远程路径对齐&#xff0c;方便后续运行 mapping映射&#xff0c;本地路径和远程路径 点击Browse 可以在右侧同步查看更新情况

【Element-UI快速入门】

文章目录 **Element-UI快速入门****一、Element-UI简介****二、安装Element-UI****三、引入Element-UI****四、使用Element-UI组件****五、自定义Element-UI组件样式****六、Element-UI布局组件****七、Element-UI表单组件****八、插槽&#xff08;Slots&#xff09;和主题定制…

VS项目Debug下生成的EXE在生产机器上运行

使用Visual Studio开发应用程序时&#xff0c;为了临时在非开发机上看一下效果&#xff0c;就直接把Debug下的文件全部拷贝到该机器上&#xff0c;直接双击exe运行。双击之后&#xff0c;没有直接打开应用程序&#xff0c;而是弹出了一个Error弹框。  赶快在网上搜了一遍&…

浏览器执行渲染原理

一、事件循环 事件循环&#xff08;Event Loop&#xff09;是JavaScript的执行环境的核心概念之一&#xff0c;它负责处理JavaScript中的异步操作和执行顺序。事件循环使得JavaScript能够在单线程上有效地处理并发&#xff0c;同时保持编程模型的简单性。 以下是事件循环的一…