C#语言基础速成Day07
“知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。”
目录
- 前言
- 文章有误敬请斧正 不胜感恩!||Day07
- C#常见数据结构:
- 1. 集合(Collection)
- 1.1 **List<T>**
- 1.2 **HashSet<T>**
- 1.3 **LinkedList<T>**
- 1.4 **ObservableCollection<T>**
- 2. 栈(Stack)
- 2.1深度优先搜索(DFS)
- 2.2广度优先搜索(BFS)
- 代码解释
- 适用场景
- 3. 堆(Heap)
- 3.1 **内存管理中的堆**
- 3.2 **堆数据结构**
- 4. 队列(Queue)
- 5. 字典(Dictionary)
- 5.1 **其他字典类型**
- 总结
前言
昨天我们学习了C#属性访问器、方法参数和C#字符串,StringBuilder的一些内容,今天我们学习C#常见数据结构。
文章有误敬请斧正 不胜感恩!||Day07
以下是本篇文章正文内容:
C#常见数据结构:
数据结构和算法一直是学习编程语言绕不开的部分,今天我们就一起来学习一些基本的数据结构,将来可以通过力扣,牛客,cf 等网站来学习我们数据结构和算法部分。
好的,让我们更详细地探讨 C# 中的集合、栈、堆、队列和字典。我们将通过更深入的解释和具体的示例代码来扩展这些内容。
1. 集合(Collection)
C# 中的集合提供了处理一组对象的灵活方式。集合通常被封装在 System.Collections.Generic
命名空间中。每种集合类型都有其独特的特性,适用于不同的需求。
1.1 List
List<T>
是一种动态数组,它允许按照索引快速访问元素,并且在添加或删除元素时可以自动调整大小。它是最常用的集合之一,适用于需要频繁添加、删除或按索引访问元素的场景。
示例代码:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
numbers.Add(6);
numbers.Remove(3);
int number = numbers[2]; // 获取第三个元素
1.2 HashSet
HashSet<T>
是一种无序的集合,不允许包含重复元素。它使用哈希表来存储数据,提供了快速的查找、添加和删除操作,非常适合需要确保唯一性的场景。
示例代码:
HashSet<string> fruits = new HashSet<string> { "Apple", "Banana", "Cherry" };
fruits.Add("Banana"); // 无效操作,因为 "Banana" 已存在
bool containsApple = fruits.Contains("Apple"); // 返回 true
1.3 LinkedList
LinkedList<T>
是一个双向链表,允许快速的插入和删除操作,尤其适用于需要在集合中间频繁插入或删除元素的场景。
示例代码:
LinkedList<string> linkedList = new LinkedList<string>();
linkedList.AddLast("First");
linkedList.AddLast("Second");
linkedList.AddFirst("Zero");
linkedList.Remove("Second");
1.4 ObservableCollection
ObservableCollection<T>
是一个支持通知机制的集合,当集合的内容发生变化时,它会通知绑定的用户界面组件。这个特性使得它非常适用于数据绑定(Data Binding)场景,尤其是在 WPF 或 UWP 应用中。
示例代码:
ObservableCollection<string> observableList = new ObservableCollection<string>();
observableList.CollectionChanged += (sender, args) =>
{Console.WriteLine("Collection changed");
};
observableList.Add("New Item"); // 触发 CollectionChanged 事件
2. 栈(Stack)
Stack<T>
是一种后进先出(LIFO, Last In First Out)的数据结构。它类似于一堆盘子,你只能从顶部取下盘子(弹出 Pop
操作),也只能在顶部放置新的盘子(推入 Push
操作)。栈非常适合处理需要反向顺序处理数据的场景,比如撤销操作或深度优先搜索(DFS)算法。
示例代码:
Stack<string> stack = new Stack<string>();
stack.Push("First");
stack.Push("Second");
stack.Push("Third");string top = stack.Pop(); // "Third" 被移除并返回
string peek = stack.Peek(); // 返回 "Second",但不移除
在 C# 中,广度优先搜索(BFS)和深度优先搜索(DFS)是两种常用的图遍历算法。我们可以记住以下模板加快我们的刷题速度:
2.1深度优先搜索(DFS)
深度优先搜索是一种递归算法,沿着图的深度遍历节点,直到无法继续为止,然后回溯。
using System;
using System.Collections.Generic;class Node {public List<Node> Neighbors { get; set; }public Node() {Neighbors = new List<Node>();}
}class GraphTraversal {public bool DFS(Node cur, Node target, HashSet<Node> visited) {if (cur == target) {return true;}visited.Add(cur);foreach (Node next in cur.Neighbors) {if (!visited.Contains(next)) {if (DFS(next, target, visited)) {return true;}}}return false;}
}class Program {static void Main() {// 创建节点和图的结构Node start = new Node();Node target = new Node();// 添加邻居节点以构建图...HashSet<Node> visited = new HashSet<Node>();GraphTraversal traversal = new GraphTraversal();bool pathExists = traversal.DFS(start, target, visited);Console.WriteLine(pathExists ? "Path exists!" : "No path found.");}
}
2.2广度优先搜索(BFS)
广度优先搜索是一种非递归算法,使用队列逐层遍历图的节点。
using System;
using System.Collections.Generic;class Node {public List<Node> Neighbors { get; set; }public Node() {Neighbors = new List<Node>();}
}class GraphTraversal {public bool BFS(Node start, Node target) {Queue<Node> queue = new Queue<Node>();HashSet<Node> visited = new HashSet<Node>();queue.Enqueue(start);visited.Add(start);while (queue.Count > 0) {Node cur = queue.Dequeue();if (cur == target) {return true;}foreach (Node next in cur.Neighbors) {if (!visited.Contains(next)) {queue.Enqueue(next);visited.Add(next);}}}return false;}
}class Program {static void Main() {// 创建节点和图的结构Node start = new Node();Node target = new Node();// 添加邻居节点以构建图...GraphTraversal traversal = new GraphTraversal();bool pathExists = traversal.BFS(start, target);Console.WriteLine(pathExists ? "Path exists!" : "No path found.");}
}
代码解释
-
DFS:
- 递归遍历图中的每个节点,如果找到目标节点,则返回
true
。 visited
集合用于跟踪已经访问过的节点,以防止循环。
- 递归遍历图中的每个节点,如果找到目标节点,则返回
-
BFS:
- 使用队列来逐层遍历图中的节点,确保首先访问距离起点最近的节点。
- 通过
visited
集合跟踪已访问的节点,避免重复访问。
适用场景
- DFS 通常用于寻找所有可能路径、路径存在性验证或图的连通性检测。
- BFS 更适合用于寻找最短路径(无权重图)或分层搜索。
这两种算法在不同的图结构和问题中有不同的表现。选择使用哪种算法应根据具体问题的要求来决定。
3. 堆(Heap)
在 C# 中,堆(Heap)主要是指内存管理中的概念,而不是特定的数据结构。在托管堆(Managed Heap)中,动态分配的对象被存储,并由垃圾回收器(Garbage Collector)自动管理它们的生命周期。
3.1 内存管理中的堆
堆用于存储应用程序运行时创建的动态对象,例如在 new
操作符下创建的实例。堆的大小是动态的,内存管理器根据需要分配和释放内存空间。C# 的垃圾回收器会自动清理不再使用的对象,减少内存泄漏的风险。
示例代码:
class MyClass
{public int Value;
}MyClass myObject = new MyClass();
myObject.Value = 10;
// 对象 myObject 存储在堆中,直到不再使用,垃圾回收器会自动清理
3.2 堆数据结构
尽管 C# 语言本身没有直接的堆数据结构实现,但可以通过 PriorityQueue<TElement, TPriority>
类(在 .NET 6+ 中引入)来模拟优先级队列(Priority Queue),这实际上使用堆结构来管理数据。
示例代码:
PriorityQueue<string, int> priorityQueue = new PriorityQueue<string, int>();
priorityQueue.Enqueue("Low priority", 3);
priorityQueue.Enqueue("High priority", 1);
priorityQueue.Enqueue("Medium priority", 2);while (priorityQueue.Count > 0)
{string item = priorityQueue.Dequeue();Console.WriteLine(item);
}
// 输出顺序为 "High priority", "Medium priority", "Low priority"
4. 队列(Queue)
Queue<T>
是一种先进先出(FIFO, First In First Out)的数据结构。队列的典型应用场景包括任务调度、请求处理等,其中需要以进入的顺序处理项目。
示例代码:
Queue<string> queue = new Queue<string>();
queue.Enqueue("First");
queue.Enqueue("Second");
queue.Enqueue("Third");string firstItem = queue.Dequeue(); // "First" 被移除并返回
string nextItem = queue.Peek(); // 返回 "Second",但不移除
5. 字典(Dictionary)
Dictionary<TKey, TValue>
是一种键值对(Key-Value Pair)的数据结构,允许根据键快速查找对应的值。键必须是唯一的,这意味着字典非常适合处理需要快速查找或存储与唯一标识符相关的数据的场景。
示例代码:
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "One");
dictionary.Add(2, "Two");
dictionary.Add(3, "Three");if (dictionary.ContainsKey(2))
{string value = dictionary[2]; // 获取键 2 对应的值 "Two"
}dictionary.Remove(3); // 移除键为 3 的键值对
5.1 其他字典类型
- SortedDictionary<TKey, TValue>: 一个按键排序的字典,使用二叉树实现。
- ConcurrentDictionary<TKey, TValue>: 一个线程安全的字典,适用于多线程环境。
总结
C# 提供了多种数据结构来帮助开发者高效管理和处理数据。通过了解和正确使用这些数据结构,可以大大提高代码的性能和可维护性。根据具体的需求选择合适的集合类型、栈、队列或字典,是编写高质量代码的关键。
呜呼!今天我们C#语言的基础部分就算结束了,后面还有更加深奥的知识等着我们。以后我们还会更新关于其他语言的一些知识。C#更加复杂的部分还在后面我们今后可以通过一些实战的案例来学习。如果您学到了一些有点用的知识,不妨点赞,分享关注一波。
相关文章:

C#语言基础速成Day07
“知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。” 目录 前言文章有误敬请斧正 不胜感恩!||Day07 C#常见数据结构:1. 集合(Collection)1.1 **List<T>**1.2 **H…...

jvm运行时常量池溢出的原因
Java虚拟机(JVM)的运行时常量池(Runtime Constant Pool)是方法区的一部分,用于存储类和接口的常量池表,包括字面量和对类型、字段和方法的符号引用。运行时常量池溢出通常指的是常量池的内存使用达到了JVM设…...
floyd算法详解
算法是一种用于求解所有顶点对之间的最短路径问题的算法,特别适用于稠密图。下面是一个使用C实现的算法示例: #include <iostream> #include <climits> // For INT_MAXusing namespace std;const int V 4; // 图的顶点数// 定义一个函数来…...

Web前端性能优化的方向
减少dom渲染复杂列表优化缓存优化首页背景图片加载慢,可以放在服务器上,读取绝对路径900k的图片大小有些大,可以对图片进行压缩,tinypng网站压缩、熊猫压缩、bing域名下的图片url后面带参数w、h、qlt剪裁下拉框数据较多进行懒加载…...

【面试题】设计模式-责任链模式
设计模式-责任链模式 前言责任链简历案例代码小结 前言 我们知道,设计模式是面试时经常被问到的问题之一,这是因为设计模式能够体现出代码设计的美感,且在很多框架的底层也都会使用到各种设计模式,所以对设计模式的考察ÿ…...

JavaEE 第8节 单例模式详解
目录 概念 饿汉模式 懒汉模式 懒汉模式在多线程环境下的优化 1.线程安全问题 2.效率问题 3.指令重排序导致的问题 1)为什么要进行指令重排序? 2)指令重排序在上述代码为什么会构成问题? 导读: 单例模式是一种…...

OpenAI 发布 GPT-4o 模型安全评估报告:风险等级为“中等”|TodayAI
OpenAI 近日发布了最新的 GPT-4o 系统卡,这是一份研究文件,详细介绍了公司在推出其最新 AI 模型之前所进行的安全措施和风险评估。根据该评估报告,GPT-4o 的总体风险等级被评定为 “中等” 。 GPT-4o 于今年 5 月首次公开发布。在其发布之前…...

学习前端面试知识
2024-8-9 打卡第十天 学习视频链接 js延迟加载 延迟加载:等页面加载完成后再进行加载提高页面加载速度defer属性,同步加载,让脚本与文档同步解析,顺序执行,当文档解析完成再执行defer,执行完再执行脚本&…...

Leetcode JAVA刷刷站(9)回文数
一、题目概述 二、思路方向 在Java中,判断一个整数是否为回文数,可以通过将该整数转换为字符串,然后比较字符串与其反转后的字符串是否相同来实现。但这种方法在整数非常大时可能不太高效,因为它依赖于字符串操作。一个更高效的方…...

数据结构算法
⩕ 单调栈 1、概念 对于一个栈,维持其单调性,有两种情况,单调递增栈:由栈底到栈顶单调递增 单调递减栈:由栈底到栈顶单调递减 2、核心模板( 单调递增栈 ) stack<int> stk; void …...

WordPress个性化站点
这个信息爆炸的时代,拥有一个能够迅速传达信息、展示个性、并能够与世界互动的在线平台,已成为企业和个人的基本需求。WordPress以其无与伦比的易用性和强大的扩展性,成为了构建此类平台的首选工具。而LNMP是由Linux、Nginx、MySQL和PHP组成的…...

GESP C++ 2024年03月一级真题卷
一、单选题(每题 2 分,共 30 分) 第 1 题 C表达式 (3 - 2) * 3 5 的值是( )。 A. -13 B. 8 C. 2 D. 0 答案:B 解析:略 第 2 题 C 语句 cout << "5%2" << 5 % 2 执行后的输出是…...

Linux驱动开发基础(Hello驱动)
所学内容来自百问网 目录 1. 文件在内核中的表示 2. 打开字符设备节点时,内核中也有对应的struct file 3. 编写驱动程序步骤 4. 相关知识点 4.1 涉及函数解析 4.2 module_init/module_exit的实现 4.3 register_chrdev的内部实现 4.4 class_destroy/device_…...

centos7安装 ES集群 elasticsearch
这里写自定义目录标题 编写启动脚本 elasticsearch.sh启动可能报错:elasticsearch 7.10启动报错 bootstrap checks failed解决方法问题原因:注意 退出xshell,重新登录: 上面两个配置项改完后,ES启动用户(es 或root) **…...

互联网应用主流框架整合【Redis数据结构及常用命令】
在大部分情况下我们使用Redis只是执行一些简单的命令操作,通常无需区分是否是在一个连接池里的同一个链接去执行,如果需要执行多条命令,需要保证命令在同一个链接里完成,则采用SessionCallback接口操作即可 Redis数据结构-字符串…...

GORM 自动迁移与命名策略
在现代软件开发中,数据库结构的维护和迁移是常见的挑战之一。GORM,作为 Go 语言中强大的 ORM 库,提供了自动迁移功能,帮助开发者轻松地管理数据库表结构的变更。此外,GORM 还允许开发者通过命名策略(Naming…...

python社会科学问题研究的计算实验
实验十五:社会科学问题研究的计算实践 1.实验目标及要求 (1)掌握网络视角 (2)掌握社会网络基础内容 (3)掌握友谊悖论 2.实验主要内容 随机生成一次符合社会网络特征的网络,通过计…...

Element Plus 发布 2.8.0
功能特性 组件更新 [color-picker] alpha-slider a11y (#14245 by tolking)添加 mention 组件 (#17586 by Fuphoenixes)[tree-v2] 添加 scrollTo 方法 (#14050 by kaine0923)[drawer] 添加 append-to 属性 (#17761 by tolking)[table] tree children 添加严格检查 (#13519 by t…...

解释区块链技术的应用场景和优势-水文
区块链技术是一种去中心化的分布式账本技术,其应用场景和优势如下: 金融领域:区块链可以用于加密货币交易,提供安全的、去中心化的支付系统。它也可以用于股票、债券和其他金融交易的记录和结算,提高交易的透明度和效率…...

等保测评基础知识(一)
1、时间类: 网络安全法: 2017年6月1日等保2.0实施时间: 2019年12月1日密码法: 2020年1月1日个人信息保护法: 2021年11月1日,数据安全法实施时间: 2021年9月1日关键信息基础…...

股指期货套期保值中的展期管理有哪些?
在复杂的金融市场环境中,展期作为一种重要的风险管理工具,被广泛应用于期货交易中,特别是当投资者需要对长期资产进行套期保值时。展期的核心思想在于,通过连续替换高流动性的近月期货合约来替代流动性较差的远月合约,…...

如何通过参考文献找到原文
当只有参考文献想要获取原文时,通常会用到以下方法: 举例参考文献1. 杨忠华,周勃,宁宝宽,等.面向新能源产业的专业研究生研创能力培养实践探索——基于“政产学研用”融合驱动[J].高教学刊,2024,10(23):19-22.DOI:10.19980/j.CN23-1593/G4.2024.23.004…...

春秋云境 | SQL | CVE-2022-4230
目录 靶标介绍 开启靶场 wpscan漏洞介绍 查询数据库表名 查询表中字段名 查询字段下数据 靶标介绍 WP Statistics WordPress 插件13.2.9之前的版本不会转义参数,这可能允许经过身份验证的用户执行 SQL 注入攻击。默认情况下,具有管理选项功能 (ad…...

3.串口(UART)
串口理论部分可看51部分:链接 数据帧 帧头(2字节,例如AA、BB) 数据长度(2字节) 数据 CRC16校验(2字节) 帧尾(2字节) 代码编写 串口一发送命令控制LED灯(PB5、PE5) LED灯、串口、…...

macOS Sonoma 14.6.1 (23G93) Boot ISO 原版可引导镜像下载
macOS Sonoma 14.6.1 (23G93) Boot ISO 原版可引导镜像下载 2024 年 8 月 8 日凌晨,macOS Sonoma 14.6.1 发布,本更新包含了重要的错误修复,并解决了导致高级数据保护无法启用或停用的问题。同时带来了 macOS Ventura 13.6.9 安全更新。 本…...

论企业私域流量运营中的玩法创新与开源 AI 智能名片 O2O 商城小程序的应用
摘要:本文旨在探讨企业在构建私域流量池时的多种玩法策略,并着重分析如何针对不同类型客户制定个性化方案。同时,引入开源 AI 智能名片 O2O 商城小程序这一工具,阐述其在私域流量运营中的重要作用和价值,为企业提升运营…...

nginx.conf alias 静态资源 别名 nginx配置
Linux系统Bug 报权限不足错误 user root; 解决server_name太长时报错的问题 #解决server_name太长时报错的问题server_names_hash_bucket_size 64; 解决文件上传默认限制1M的问题 #解决文件上传默认限制1M的问题client_max_body_size 100m; 监听所有端口 server_name _; a…...

pve虚拟机使用
文章目录 1.pve 直通硬盘 1.pve 直通硬盘 查看硬盘号: ls /dev/disk/by-id -lqm set 101 --virtio1 /dev/disk/by-id/usb-HIKSEMI__93963907-0:0挂载sata类型: qm set 101 --sata1 /dev/disk/by-id/ata-ST4000DM004-2U9104_WFN7TMVV可以将一个硬盘挂…...

Linux:进程概念详解
1. 冯诺依曼体系结构 截至目前,我们所认识的计算机,都是有一个个的硬件组件组成 。 【注意】: a. 这里的存储器指的是内存 b. 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备) c.外…...

cms框架cookice注入漏洞
目录 一、环境 二、开始分析 2.1代码审计(未授权访问) 一、环境 环境私聊获取 二、开始分析 2.1代码审计(未授权访问) 我们可以看到构造函数ip是通过X_FORWARDED_FOR来获取的,而这个刚好可以伪造,那我…...