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#更加复杂的部分还在后面我们今后可以通过一些实战的案例来学习。如果您学到了一些有点用的知识,不妨点赞,分享关注一波。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端(三):Ajax

一、Ajax Asynchronous JavaScript And XML&#xff0c;简称Ajax&#xff0c;是异步的JavaScript和XML。 作用&#xff1a;数据交换&#xff0c;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互&#xff1a;可以在不重新加载整个页面的情况下&…

本地环境VMware使用代理解决 Docker 镜像拉取问题

引言 本文将分享我在 Windows 10 环境下&#xff0c;通过 VMware 运行的 CentOS 7.8 虚拟机中配置 Docker 代理&#xff0c;成功解决了镜像拉取问题的经验。 问题描述 在尝试启动一个依赖 Docker 的 GitHub 项目时&#xff0c;拉取 Docker 镜像的失败。尝试配置了几个国内源…

Spring Boot优缺点

Spring Boot 是一款用于简化Spring应用开发的框架&#xff0c;它集成了大量常用的框架和工具&#xff0c;大大简化了Spring项目的配置和部署。下面是Spring Boot的优缺点&#xff1a; 优点&#xff1a; 简化配置&#xff1a;Spring Boot自动配置功能可以根据应用的依赖自动配…

Spring Boot - 在Spring Boot中实现灵活的API版本控制(上)

文章目录 为什么需要多版本管理&#xff1f;在Spring Boot中实现多版本API的常用方法1. URL路径中包含版本号2. 请求头中包含版本号3. 自定义注解和拦截器 注意事项 为什么需要多版本管理&#xff1f; API接口的多版本管理在我们日常的开发中很重要&#xff0c;特别是当API需要…

2.mysql数据库-DML-DQL-DCL

1. DML-操作数据 1.1 DML-添加数据 给指定字段添加数据 INSERT INTO 表名 (字段名1&#xff0c;字段名2,…) values (值1,值2…) 给全部字段添加数据 INSERT INTO 表名 values(值1,值2,…) 批量添加数据 INSERT INTO 表名 (字段名1&#xff0c;字段名2,…) values (值1,值2……

Java并发编程实战 读书笔记

目录 1、介绍 2、线程安全 3、共享对象 1、介绍 线程的优点 恰当使用线程&#xff0c;可以提升复杂程序的性能&#xff0c;降低开发和维护成本可以把一部分复杂代码转为直接、简洁易懂的代码更有效地利用空闲处理器资源&#xff0c;提高吞吐量用户界面有更好的响应性线程的…

网络安全 - 应急响应检查表

前言 本项目旨在为应急响应提供全方位辅助&#xff0c;以便快速解决问题。结合自身经验和网络资料&#xff0c;形成检查清单&#xff0c;期待大家提供更多技巧&#xff0c;共同完善本项目。愿大家在应急之路一帆风顺。 图片皆来源于网络&#xff0c;如有侵权请联系删除。 一…

常见框架漏洞 中(IIS6.x、IIS7.x、Apache、Nginx)

目录 中间件 IIS IIS6.x篇 PUT漏洞 漏洞描述 环境 漏洞复现 漏洞复现 工具连接 IIS6.0解析漏洞 IIS短文件漏洞 漏洞描述 原理 复现 短⽂件名特征&#xff1a; ⼯具 IIS RCE-CVE-2017-7269 简介 影响范围 复现 利⽤⼯具 反弹shell Apache 未知扩展名解析…

Oracle【plsql编写九九乘法表】

九九乘法表 DECLAREi NUMBER : 1;j NUMBER : 1; BEGINFOR i IN 1 .. 9LOOPFOR j IN 1 .. iLOOPDBMS_OUTPUT.put (i || * || j || || i * j || );END LOOP;DBMS_OUTPUT.put_line ( );END LOOP; END;输出结果

Vue3从零开始——如何巧妙使用setup语法糖、computed函数和watch函数

文章目录 一、setup语法糖二、computed函数2.1 computed的基本用法2.2 computed vs methods2.3 注意事项 三、watch函数3.1 watch的基本用法3.2 immediate和deep选项 四、综合小Demo五、总结 一、setup语法糖 之前我们在编写代码时每次都要编写setup()​ ,默认导出配置&#x…

浮毛季到了,拒绝猫咪变成“蒲公英”,宠物空气净化器去除浮毛

同为铲屎官&#xff0c;面对家中无处不在的猫毛挑战&#xff0c;想必你也深感头疼。衣物、沙发乃至地毯上的明显猫毛尚可通过吸尘器或粘毛器轻松应对&#xff0c;但那些细微漂浮的毛发却成了难以捉摸的“小恶魔”&#xff0c;普通的空气净化器往往力不从心。对于浮毛&#xff0…

分享安装Windows11系统相关的经验

文章目录 1. 概述2. 安装过程3. 经验分享本章回中我们准备向大家介绍如何安装 Window11操作系统同时分享一些相关的安装经验。 1. 概述 有看官说都什么年代了还介绍如何安装操作系统,不过介绍安装操作系统的方法不是我的重点,我的重点是分享相关的安装经验,帮助大家少走弯…

熵权法模型(评价类问题)

目录 本文章内容参考&#xff1a; 一. 概念 二. 特点 三. 实现步骤 四. 代码实现 本文章内容参考&#xff1a; 熵权法模型讲解(附matlab和python代码) 【数学建模快速入门】数模加油站 江北_哔哩哔哩_bilibili 一. 概念 利用信息熵计算各个指标的权重&#xff0c;从而为…

nvm 切换、安装 Node.js 版本

nvm下载路径 往下拉找到Assets 下载后&#xff0c;找到nvm-setup.exe双击&#xff0c;一直无脑下一步&#xff0c;即可安装成功。 配置环境变量&#xff08;我的是window11&#xff09; 打开任务栏设置–搜环境变量 配置好后&#xff0c;点确定一层一层关闭 windowR 打开控制…

Datawhale X 魔搭 AI夏令营 Task 01

Task 01 1. 注册阿里云 2. 跑通baseline 3. 生成图片并提交 后续思路&#xff1a; 调整prompt&#xff1b;更换微调数据集使用gpt生成故事简介

C++之类与对象(完结撒花篇)

目录 前言 1.再探构造函数 2.类型转换 3.static成员 4. 友元 5.内部类 6.匿名对象 7.对象拷贝时的编译器优化 结束语 前言 在前面的博客中&#xff0c;我们对类的默认成员函数都有了一定了解&#xff0c;同时实现了一个日期类对所学的没内容进行扩展延伸&#xff0c;本…

JavaWeb04-MyBatis与Spring结合

目录 前言 一、MyBatis入门&#xff08;MyBatis官网&#xff09; 1.1 创建mybatis项目&#xff08;使用spring项目整合式方法&#xff09; 1.2 JDBC 1.3 数据库连接池 1.4 实用工具&#xff1a;Lombok 二、MyBatis基础操作 2.1 准备工作 2.2 导入项目并实现操作 2.3 具…

Linux-Haproxy搭建Web群集

LVS在企业应用中抗负载能力强 不支持正则处理&#xff0c;不能实现动静分离对于大型网格&#xff0c;LVS的实施配置复杂&#xff0c;维护成本较高 Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件 适用于负载大的Web站点运行在硬件上可支持数以万计的…

【C++高阶】:特殊类设计和四种类型转换

✨ 人生如梦&#xff0c;朝露夕花&#xff0c;宛若泡影 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…

Java二十三种设计模式-策略模式(13/23)

策略模式&#xff1a;灵活算法的替换与扩展 引言 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了算法族&#xff0c;分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;此模式让算法的变化独立于使用算法的客户。 基础…