• C#中LinkedList、Queue<T>和Stack<T>的使用


    1、LinkedList(链表)

    链表中元素存储内存中是不连续分配,每个元素都有记录前后节点,节点值可以重复,不能通过下标访问,泛型的使用保证类型安全,可以避免装箱拆箱,找元素就只能遍历,查找不方便,增删比较快。

    例如,

    1. Console.WriteLine("***************LinkedList******************");
    2. LinkedList<string> linkedList = new LinkedList<string>();
    3. linkedList.AddFirst("C/C++");
    4. linkedList.AddLast("Java");
    5. bool isContain = linkedList.Contains("Java");
    6. LinkedListNode<string> nodeC = linkedList.Find("C/C++"); // 从头查找
    7. linkedList.AddBefore(nodeC, "C#");
    8. linkedList.AddAfter(nodeC, "Python");
    9. foreach(var item in linkedList)
    10. {
    11. Console.WriteLine("item = "+item);
    12. }
    13. linkedList.Remove("Java");
    14. linkedList.Remove(nodeC);
    15. linkedList.RemoveFirst();
    16. linkedList.RemoveLast();
    17. linkedList.Clear();

     

    2、Queue(队列)

    Queue是链表,先进先出,不能通过下标访问,泛型的使用保证类型安全,可以避免装箱拆箱,找元素就只能遍历,查找不方便,增删比较快。

    例如,

    1. Console.WriteLine("***************Queue******************");
    2. Queue queue = new Queue();
    3. queue.Enqueue("C/C++");
    4. queue.Enqueue("C#");
    5. queue.Enqueue("Java");
    6. queue.Enqueue("Python");
    7. queue.Enqueue("CJavaPy");
    8. queue.Enqueue("JS");
    9. foreach (string item in queue)
    10. {
    11. Console.WriteLine(item);
    12. }
    13. Console.WriteLine($"Dequeuing '{queue.Dequeue()}'");
    14. Console.WriteLine($"Peek at next item to dequeue: { queue.Peek()}");
    15. Console.WriteLine($"Dequeuing '{queue.Dequeue()}'");
    16. Queue queueCopy = new Queue(queue.ToArray());
    17. foreach (string item in queueCopy)
    18. {
    19. Console.WriteLine(item);
    20. }
    21. Console.WriteLine($"queueCopy.Contains(\"c#\") = {queueCopy.Contains("c#")}");
    22. queueCopy.Clear();
    23. Console.WriteLine($"queueCopy.Count = {queueCopy.Count}");

     

    注意ConcurrentQueue 线程安全版本的Queue。

    3、Stack(堆栈)

    Stack是链表,先进后出,不能通过下标访问,泛型的使用保证类型安全,可以避免装箱拆箱,找元素就只能遍历,查找不方便,增删比较快。

    例如,

    1. Console.WriteLine("***************Stack******************");
    2. Stack stack = new Stack();
    3. stack.Push("C/C++");
    4. stack.Push("C#");
    5. stack.Push("Java");
    6. stack.Push("Python");
    7. stack.Push("CJavaPy");
    8. stack.Push("JS");
    9. foreach (string item in stack)
    10. {
    11. Console.WriteLine(item);
    12. }
    13. Console.WriteLine($"Pop '{stack.Pop()}'");//获取并移除
    14. Console.WriteLine($"Peek at next item to dequeue: { stack.Peek()}");//获取不移除
    15. Console.WriteLine($"Pop '{stack.Pop()}'");
    16. Stack stackCopy = new Stack(stack.ToArray());
    17. foreach (string item in stackCopy)
    18. {
    19. Console.WriteLine(item);
    20. }
    21. Console.WriteLine($"stackCopy.Contains(\"C#\") = {stackCopy.Contains("C#")}");
    22. stackCopy.Clear();
    23. Console.WriteLine($"stackCopy.Count = {stackCopy.Count}");

     注意ConcurrentStack线程安全版本的Stack。

  • 相关阅读:
    制定测试计划和测试用例
    jquery中的attr()和prop()的区别是什么?
    CG MAGIC分享3ds Max卡顿未保存处理方法有哪些?
    Python学习备忘录
    FaceChain-FACT:免训练的丝滑体验,秒级别的人像生成
    C# 第二章『基础语法』◆第4节:foreach循环语句
    校招失败,在小公司熬了 2 年后我终于进了阿里,竭尽全力(Java 岗)
    使用大语言模型 LLM 做文本分析
    【linux】设备驱动程序、块设备和字符设备区别
    Linux系统编程系列之线程
  • 原文地址:https://blog.csdn.net/lwf3115841/article/details/133812316