C#中的算法与数据结构:高效.NET代码的基础
在现代.NET平台开发中,掌握算法与数据结构是创建高性能、可扩展应用程序的必备技能。无论您是在编写ASP.NET Core的Web服务、WPF的桌面应用还是Xamarin的移动解决方案,正确选择数据结构都会直接影响程序运行速度和内存消耗。本文将用C#语言解析关键数据结构与算法,每个章节都配有实用代码示例。
1. C#基础数据结构:数组与列表
我们从最基础的内容开始。C#中有多种内置集合类型,理解它们的内部机制至关重要。
数组 (Array)
数组是固定长度的同类型元素序列。它提供最快的索引访问速度(O(1)),但创建后无法改变大小。
int[] numbers = new int[5] { 10, 20, 30, 40, 50 };// 索引访问int thirdElement = numbers[2]; // 30// 修改元素numbers[3] = 100;当元素数量已知且不会变化时(例如存储常量或固定缓冲区),请使用数组。
列表 (List<T>)
List<T>是动态数组。添加新元素时会自动扩容。其内部使用普通数组,在容量不足时会重新创建数组。
List<string> fruits = new List<string>();fruits.Add("苹果");fruits.Add("香蕉");fruits.Add("橙子");Console.WriteLine(fruits.Count); // 3fruits.RemoveAt(1); // 删除"香蕉"对于需要顺序访问和频繁改变集合大小的场景,List<T>是通用选择。
2. 栈与队列:LIFO和FIFO原则
这两种数据结构实现了严格的元素添加和提取规则。它们在表达式解析、延迟任务处理和遍历算法实现中不可或缺。
栈 (Stack<T>)
栈遵循"后进先出"(LIFO)原则。在.NET中,栈实现为泛型集合。
Stack<int> stack = new Stack<int>();stack.Push(1);stack.Push(2);stack.Push(3);
int top = stack.Pop(); // 3int peek = stack.Peek(); // 2(不删除)实际应用:检查字符串中的括号匹配或实现浏览器的"后退"按钮。
队列 (Queue<T>)
队列遵循"先进先出"(FIFO)原则。这是按到达顺序处理任务的理想选择。
Queue<string> queue = new Queue<string>();queue.Enqueue("任务1");queue.Enqueue("任务2");queue.Enqueue("任务3");
string task = queue.Dequeue(); // "任务1"string nextTask = queue.Peek(); // "任务2"队列广泛应用于生产者-消费者模式、消息处理和日志系统。
3. C#中的树与递归算法
树是层次化结构,每个节点可以有多个子节点。二叉搜索树(BST)尤为特殊,它能提供快速的搜索、插入和删除操作(平均O(log n))。
二叉搜索树的实现
public class TreeNode{ public int Value; public TreeNode Left; public TreeNode Right;
public TreeNode(int value) { Value = value; }}
public class BinarySearchTree{ public TreeNode Root;
public void Insert(int value) { Root = InsertRec(Root, value); }
private TreeNode InsertRec(TreeNode root, int value) { if (root == nu