C#语言基础速成Day07

news2024/11/13 10:08:23

“知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。”

目录

  • 前言
    • 文章有误敬请斧正 不胜感恩!||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.coloradmin.cn/o/2037726.html

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

相关文章

MATLAB 样条插值

订阅专栏后,复制完整代码到MATLAB上面,即可获得跟本文相同的运行结果。 点击以下链接也可下载: https://download.csdn.net/download/callmeup/89635701 MATLAB插值代码 插值在MATLAB里面很简单,一个函数即可。 本文给出了已知点的坐标、待插值点的横坐标,可按要求插出来…

使用 Gradio 开发 ChatBot

Gradio 提供了 ChatInterface 组件&#xff0c;组件包括一个输入框、一个 ChatBox 区域、和一些按钮。同 interface&#xff0c;ChatInterface 通过一个处理函数进行处理&#xff0c;处理函数包括两个参数 message 和 history&#xff0c;message 是当前用户提交的问题&#xf…

[图解]需要≠需求-《分析模式》漫谈

1 00:00:00,760 --> 00:00:02,910 今天的《分析模式》漫谈 2 00:00:02,920 --> 00:00:04,180 我们来说一下 3 00:00:04,490 --> 00:00:06,490 需要不等于需求 4 00:00:10,490 --> 00:00:11,760 还是第一章 5 00:00:13,120 --> 00:00:15,020 这里 6 00:00:1…

[C#]实现GRPC通讯的服务端和客户端实例

最近要做两个软件之间消息的通讯&#xff0c;学习了一下GRPC框架的通讯。根据官方资料做了一个实例。 官方资料请参考&#xff1a;Create a .NET Core gRPC client and server in ASP.NET Core | Microsoft Learn 开发平台&#xff1a;Visual Studio 2022 开发前提条件&#x…

llama的神经网络结构;llama的神经网络结构中没有MLP吗;nanogpt的神经网络结构;残差是什么;残差连接:主要梯度消失

目录 解释代码 潜在问题和修正 结论 llama的神经网络结构 神经网络结构概述 举例说明 llama的神经网络结构中没有MLP吗 nanogpt的神经网络结构 1. 词嵌入层(Embedding Layer) 2. Transformer编码器层(Transformer Encoder Layer) 3. 层归一化(Layer Normalizat…

Linux文本处理常见工具

文章目录 文件内容查看查看文本文件内容cattacrevnl 查看非文本文件内容hexdumpodxxd 分页查看文件内容moreless 显示文本前后的行内容headtail文件描述符如果找到文件描述符 查看最新日志范例&#xff1a;找出IP地址的那一行 cut--按列抽取文本按分隔符按字符位置取网卡ip tr-…

Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard

目录 Kubernetes介绍 Kubernetes具备的功能 Kubernetes集群角色 Master管理节点组件 Node工作节点组件 非必须的集群插件 Kubernetes集群类型 Kubernetes集群规划 集群前期环境准备 开启Bridge网桥过滤 关闭SWAP交换分区 安装Containerd软件包 K8s集群部署方式 集…

关于归并排序:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2F return 语句开始之后&#xff0c;会执行之前剩余遗留下的语句和状态#include<bits/stdc.h> using namespace std…

Xilinx XAPP585相关

XAPP585中相关的状态机 第一个状态机&#xff1a;这里主要是在对时钟线延迟的基础上&#xff0c;通过BITSLIP操作&#xff0c;做时钟的对齐&#xff1b; 第二个状态机&#xff1a;这里对c_delay_in所做的操作&#xff0c;主要是对时钟线的延迟进行控制&#xff1b; delay_con…

远程代码执行漏洞

1.简介 远程代码执行(remote code execution)简称RCE&#xff0c;由于应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时&#xff0c;没有考虑用户是否控制这个字符串&#xff0c;则会导致代码执行漏洞的发生Webshell能够执行代码&#xff0c;本质上就是利用了…

新AI工程师Genie强势来袭,84秒解决代码问题

&#x1f989; AI新闻 &#x1f680; 新AI工程师Genie强势来袭&#xff0c;84秒解决代码问题 摘要&#xff1a;新兴AI软件工程师Genie因其超凡能力而引发关注&#xff0c;它在SWE-Bench排行榜上以30.07%的问题解决率远超第二名。Genie能模拟人类工程师的思维&#xff0c;自动…

CV党福音:YOLOv8实现语义分割(一)

前面我们得知YOLOv8不但可以实现目标检测任务&#xff0c;还包揽了分类、分割、姿态估计等计算机视觉任务。在上一篇博文中&#xff0c;博主已经介绍了YOLOv8如何实现分类&#xff0c;在这篇博文里&#xff0c;博主将介绍其如何将语义分割给收入囊中。 YOLOv8语义分割架构图 …

LeetCode - 54 - 螺旋矩阵

力扣54题 题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 题解思路&#xff1a; 54题和59题 螺旋矩阵Ⅱ 有些微区别&#xff0c;59是nn的方形矩阵&#xff0c;但是54需要考虑行和列不相等的情况…

Webpack中搭建本地服务dev-server

开发过程中关于实现文件内容发生变化时&#xff0c;可监听文件变化内容、自动完成编译热更新&#xff0c;webpack提供了几种可选方式&#xff1a; 1. webpack watch mode监听文件变化 watch可在导出配置中添加或者在webpack 启动命令中添加--watch 注意&#xff1a;watch 的配…

武汉流星汇聚:跨境电商引领外贸增长新引擎,展望未来发展趋势

在过去的几年里&#xff0c;跨境电商如同一股强劲的东风&#xff0c;不仅为外贸增长注入了新的活力&#xff0c;更成为了引领全球贸易发展的新引擎。随着全球经济逐渐复苏&#xff0c;跨境电商行业正以惊人的速度迈向新的高度&#xff0c;展现出其作为外贸增长关键推动力的巨大…

面试题:什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?该如何应对这种情况?如何处理 Redis 的穿透?

面试题&#xff1a;什么是 Redis 的雪崩、穿透和击穿&#xff1f;Redis 崩溃之后会怎么样&#xff1f;该如何应对这种情况&#xff1f;如何处理 Redis 的穿透&#xff1f; 面试题面试官心理分析面试题剖析缓存雪崩缓存穿透缓存击穿 面试题 了解什么是 Redis 的雪崩、穿透和击穿…

python中的列表、元组、字典之间的区别

python列表 python列表是python中使用最频繁的数据类型。 列表可以完成大多数集合类的数据结构实现。它支持字符、数字、字符串甚至可以包含列表&#xff08;即嵌套&#xff09;。 列表用"[ ]"标识&#xff0c;是python最通用的复合数据类型。列表中值的切割也可以…

RabbitMQ入门与进阶

RabbitMQ入门与进阶 基础篇1. 为什么需要消息队列?2. 什么是消息队列?3. RabbitMQ体系结构介绍4. RabbitMQ安装5. HelloWorld6. RabbitMQ经典用法(工作模式)7. Work Queues8. Publish/Subscribe9. Routing10. Topics 进阶篇1. RabbitMQ整合SpringBoot2. 消息可靠性投递故障情…

thinkphp中的sql和代码执行

目录 thinkphp5漏洞sql注入 漏洞概要. 漏洞准备 漏洞分析 代码执行 限制条件1 1 2 限制条件 1 限制条件3 php7.x php5 thinkphp5漏洞sql注入 漏洞概要. 本次漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进…

免费Excel数据批量转Word工具

下载地址&#xff1a;https://pan.quark.cn/s/5d4cff261d83 一个可以快速的将excel数据批量按照word模板进行转换的小工具。 功能&#xff1a; 1、自定义word模板&#xff0c;嵌入差值表达式 2、批量打包下载 3、自定义导出word文件名&#xff0c;支持嵌入excel字段 4、缓存导…