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日关键信息基础…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
【Ftrace 专栏】Ftrace 参考博文
ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
