当前位置: 首页 > news >正文

C#开发-集合使用和技巧(一)常用集合和方法介绍

C#开发-集合使用和技巧

(一)常用集合和方法介绍常用集合和方法介绍

  • C#开发-集合使用和技巧
  • 1. 集合基础
    • 集合介绍
    • 集合跟数组对比
  • 2.我们常用的集合类型
    • 列表`List<T>`
    • 键值对集合`Dictionary<TKey,TValue>`
    • 队列`Queue<T>`
    • 其他一些集合类型
      • 堆栈`Stack<T>`
      • 可观察集合`ObservableCollection<T> `
  • 3. 集合常见的接口介绍
      • `IEnumerable<T>` 和 `IEnumerator<T>`
      • `ICollection<T>`
      • `IList<T>`

1. 集合基础

集合介绍

集合是C#中用于存储和管理一组对象的数据结构。它们提供了比基本数据类型更灵活和强大的功能。集合可以动态调整大小,这意味着您不需要预先知道集合中将要存储多少元素。在C#中,集合通常指的是System.Collections命名空间下的类,这些类允许您存储强类型的元素集合。

基本的集合都在System.Collections命名空间中,该命名空间下面有几个命名空间,对集合进行分类

  • System.Collections.Generic通用集合,包含用于定义泛型集合的接口和类,可允许用户创建强类型集合。例如:List<T>Dictionary<TKey, TValue>
  • System.Collections.Concurrent线程安全的集合类,提供几个线程安全的集合类,主要用于多个线程访问一个集合的情况,例如ConcurrentDictionary<TKey,TValue>ConcurrentQueue<T>
  • System.Collections.ObjectModel主要是一些集合的基类,不同功能类型集合的基类,例如:``CollectionObservableCollection`等

集合跟数组对比

  • 数组 是固定大小的,一旦创建了数组,其大小就不能改变。它们在编译时就需要指定大小,并且元素必须是相同类型。
  • 集合 的大小是动态的,可以根据需要增长或缩小。它们提供了更多的灵活性,例如添加、删除和查找元素的能力。

总的来说,集合 的大小是动态的,可以根据需要增长或缩小,大多数集合支持动态添加或移除元素,这跟数组不一样,是固定大小的,一旦创建了数组,其大小就不能改变,这让集合在编程使用的场景更多。

2.我们常用的集合类型

列表List<T>

它是最常用的集合,和数组比较像的是可以通过索引访问,其他的提供了对列表进行搜索、排序和操作的方法。

List<T>提供了许多方便的方法来操作元素,例如:

  • Add(T item):向列表末尾添加一个元素。
  • Remove(T item):从列表中移除第一个匹配的元素。
  • IndexOf(T item):返回指定元素的索引。
  • Sort():对列表中的元素进行排序。

在这里插入图片描述

键值对集合Dictionary<TKey,TValue>

Dictionary<TKey, TValue>是一个键值对的集合,它提供了快速的查找能力。每个键都是唯一的,而值可以重复。它基于哈希表实现,因此查找操作通常是常数时间的。

常用需要频繁查找的情况,可以用于快速查找。

常用方法:

  • Add(TKey key, TValue value):添加一个新的键值对。
  • Remove(TKey key):移除具有指定键的项。
  • TryGetValue(TKey key, out TValue value):尝试获取具有指定键的值。

在这里插入图片描述

队列Queue<T>

Queue<T>实现了先进先出(FIFO)的数据结构。它类似于排队等候的人群,最先进来的元素最先离开。
System.Collections.Concurrent中有线程安全队列ConcurrentQueue<T>,基本用法一致。
常用方法

  • Enqueue(T item):将元素添加到队列的尾部。
  • Dequeue():移除并返回队列头部的元素。
  • TryDequeue(out T item):尝试移除并输出头部元素,成功返回True,失败返回False。

在这里插入图片描述

其他一些集合类型

堆栈Stack<T>

Stack<T>实现了后进先出(LIFO)的数据结构。它类似于一个堆栈,最后入栈的元素最先被弹出。

  • Push(T item):将元素推送到栈顶。
  • Pop():移除并返回栈顶元素。
    在这里插入图片描述

可观察集合ObservableCollection<T>

ObservableCollection<T>表示一个可观察、可监听的动态数据集合,该集合在添加或删除项或刷新整个列表时提供通知。

这个集合常用于WPF中MVVM模式的绑定,跟ListBox、DataGrid等多项控件进行动态绑定,实时更新数据。
在这里插入图片描述

3. 集合常见的接口介绍

下面介绍的接口,可能经常看到,但是不常用到,是集合的最基本的一些接口,很多功能和方法都是基于这些来实现和使用的。

IEnumerable<T>IEnumerator<T>

这是所有集合的基础,它们都实现了IEnumerable<T>接口,这意味着您可以遍历集合中的元素。
IEnumerator<T>是C#中集合的迭代器,接口提供了MoveNext(), Current, Dispose(), 和 Reset() 方法,用于迭代集合。

    //// 摘要://     公开枚举器,它支持对指定类型的集合进行简单迭代。//// 类型参数://   T://     要枚举的对象的类型。public interface IEnumerable<out T> : IEnumerable{//// 摘要://      返回一个枚举器,该枚举器可以用来遍历集合。//// 返回结果://    一个枚举器,可用于遍历集合。IEnumerator<T> GetEnumerator();}//// 摘要://     支持对泛型集合进行简单迭代。//// 类型参数://   T://     要枚举的对象的类型。public interface IEnumerator<out T> : IEnumerator, IDisposable{//// 摘要://    获取枚举器当前位置的集合中的元素。////// 返回结果://      枚举器当前位置的集合中的元素。T Current { get; }}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ICollection<T>

这个接口扩展了IEnumerable<T>,并添加了计数、是否为空、同步根和枚举器的创建方法。它还定义了添加、清除、复制到数组、移除范围内的元素和测试是否可修改的方法。

在这里插入图片描述

IList<T>

IList<T>接口继承自ICollection<T>,并且增加了索引器(通过索引访问元素),以及添加、移除和替换特定索引处的元素的方法。
在这里插入图片描述

相关文章:

  • 设计模式——访问者模式
  • python从入门到精通1:注释
  • Android 屏幕适配
  • python_根据关键词匹配文件中的数据并绘图
  • python学习—字典(Dictionary)
  • 【自动驾驶】运动底盘状态数据:里程计、IMU、运动学分析、串口通信协议
  • 计算机组成原理网课笔记2
  • 【刷力扣】23. 合并 K 个升序链表(dummy节点技巧 + 分治思维 + 优先队列)
  • 番外篇 | YOLOv8算法解析和实战应用:车辆检测 + 车辆追踪 + 行驶速度计算
  • 【shell脚本速成】函数
  • 五十三、openlayers官网示例Layer Spy解析——跟随鼠标透视望远镜效果、图层剪裁
  • LeetCode 3186 最大施法伤害
  • 如何选择适合的LabVIEW版本进行开发
  • 注解详解系列 - @ResponseStatus
  • Java中将文件转换为Base64编码的字节码
  • 【mysql】环境安装、服务启动、密码设置
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • eclipse(luna)创建web工程
  • gitlab-ci配置详解(一)
  • happypack两次报错的问题
  • input实现文字超出省略号功能
  • java中的hashCode
  • laravel with 查询列表限制条数
  • leetcode386. Lexicographical Numbers
  • node-glob通配符
  • Phpstorm怎样批量删除空行?
  • PHP的Ev教程三(Periodic watcher)
  • ubuntu 下nginx安装 并支持https协议
  • - 概述 - 《设计模式(极简c++版)》
  • 机器学习学习笔记一
  • 如何选择开源的机器学习框架?
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 网页视频流m3u8/ts视频下载
  • 温故知新之javascript面向对象
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #include到底该写在哪
  • (4)logging(日志模块)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (C语言)字符分类函数
  • (SERIES12)DM性能优化
  • (附源码)计算机毕业设计高校学生选课系统
  • (回溯) LeetCode 77. 组合
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (十二)Flink Table API
  • (四)Android布局类型(线性布局LinearLayout)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .aanva
  • .bat批处理(二):%0 %1——给批处理脚本传递参数