当前位置: 首页 > article >正文

C#中LinkedList与List的对比及应用实例

在C#中,LinkedList<T>List<T> 都是泛型集合类,但它们在设计目的、性能特性和使用场景上有所不同。

LinkedList

LinkedList<T> 表示一个双向链表的集合。在链表中,每个元素(称为节点)都包含数据和指向列表中下一个节点的引用(在双向链表中,还有指向上一个节点的引用)。

特点

  • 快速插入和删除:在链表的开头、结尾或任何已知节点处插入或删除元素通常是非常快的操作,因为不需要移动其他元素。
  • 不支持随机访问:由于链表中的元素不是连续存储的,因此不能通过索引直接访问元素。需要从头节点开始遍历链表以找到特定元素。
  • 内存使用:每个节点都需要额外的内存来存储指向其他节点的引用,这可能会导致比数组(如 List<T> 使用的)更高的内存开销。

List

List<T> 表示一个大小可按需动态增长的数组。它是基于数组实现的,但提供了额外的功能来动态调整数组的大小。

特点

  • 随机访问:由于 List<T> 是基于数组的,因此可以通过索引直接访问任何元素,这使得读取操作非常快。
  • 插入和删除性能:在列表的开头或中间插入或删除元素可能需要移动其他元素,这会导致性能下降。然而,在列表的末尾添加元素通常是非常快的。
  • 内存使用:与链表相比,List<T> 在存储元素时通常具有更低的内存开销,因为它不需要额外的引用来指向其他元素。但是,当列表增长时,它可能需要分配更大的数组并将现有元素复制到新数组中,这可能会导致额外的开销。

以下是一些关于C#中LinkedList<T>List<T>使用的具体例子,这些例子将展示它们在不同场景下的行为。

LinkedList 示例

using System;
using System.Collections.Generic;

class LinkedListExample
{
    static void Main()
    {
        // 创建一个LinkedList<string>实例
        LinkedList<string> linkedList = new LinkedList<string>();

        // 在链表末尾添加元素
        linkedList.AddLast("Item 1");
        linkedList.AddLast("Item 2");
        linkedList.AddLast("Item 3");

        // 在链表开头添加元素
        linkedList.AddFirst("Item 0");

        // 查找并修改元素
        LinkedListNode<string> nodeToUpdate = linkedList.Find("Item 2");
        if (nodeToUpdate != null)
        {
            nodeToUpdate.Value = "Item 2 Updated";
        }

        // 删除元素
        linkedList.Remove("Item 3");
        linkedList.RemoveFirst(); // 删除第一个元素
        linkedList.RemoveLast();  // 删除最后一个元素

        // 遍历链表
        Console.WriteLine("Current LinkedList:");
        foreach (var item in linkedList)
        {
            Console.WriteLine(item);
        }
    }
}

在这个例子中,我们创建了一个LinkedList<string>实例,并在链表的开头和末尾添加了元素。我们还展示了如何查找并修改链表中的元素,以及如何删除元素。最后,我们使用foreach循环遍历了链表并打印了每个元素。

List 示例

using System;
using System.Collections.Generic;

class ListExample
{
    static void Main()
    {
        // 创建一个List<int>实例
        List<int> list = new List<int>();

        // 添加元素
        list.Add(1);
        list.Add(2);
        list.Add(3);

        // 在指定位置插入元素
        list.Insert(1, 4); // 在索引1的位置插入4

        // 访问元素
        Console.WriteLine("Element at index 2: " + list[2]); // 输出4

        // 删除元素
        list.Remove(3); // 删除值为3的元素
        list.RemoveAt(0); // 删除索引为0的元素

        // 修改元素
        list[1] = 5; // 将索引为1的元素修改为5

        // 遍历列表
        Console.WriteLine("Current List:");
        foreach (var item in list)
        {
            Console.WriteLine(item);
        }

        // 对列表进行排序
        list.Sort();
        Console.WriteLine("Sorted List:");
        foreach (var item in list)
        {
            Console.WriteLine(item);
        }
    }
}

在这个例子中,我们创建了一个List<int>实例,并添加了一些整数。我们展示了如何在指定位置插入元素,如何访问元素,以及如何删除和修改元素。我们还使用了foreach循环遍历了列表,并对列表进行了排序。

区别总结

  • LinkedList<T>中,添加和删除操作在链表的开头、结尾或已知节点处通常更快,因为不需要移动其他元素。然而,由于链表不支持随机访问,因此不能通过索引直接访问元素。
  • List<T>中,可以通过索引直接访问任何元素,这使得读取操作非常快。但是,在列表的中间插入或删除元素可能需要移动其他元素,这会导致性能下降。尽管如此,List<T>通常比LinkedList<T>在内存使用上更紧凑。

http://www.kler.cn/a/429910.html

相关文章:

  • 如何实现多级缓存?
  • Linux权限
  • Swagger四种定义UI界面
  • LoViT: 用于手术阶段识别的长视频Transformer|文献速递-生成式模型与transformer在医学影像中的应用
  • canny算子解析
  • python+docx+docx2python:多文件合并,提取docx文件文本、表格及图片数据
  • AI开发: 知识图谱的初识,学会制作知识图谱- Python 机器学习
  • 基于python的自动化的sql延时注入脚本
  • 高级排序算法(一):快速排序详解
  • vue-resizable插件运用
  • vite+vue3 配置ip和端口以及自动打开浏览器
  • 【Linux】开机进入grub/怎么办?
  • 【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案
  • java中的数组(2)
  • unity3d—demo(2d人物左右移动发射子弹)
  • 如何使用LEADTOOLS创建.NET Core跨平台OCR应用程序
  • Scala 的正则表达式
  • 在 Vue 3 中实现点击按钮后禁止浏览器前进或后退
  • 4.STM32通信接口之SPI通信(含源码)---硬件SPI与W25Q64存储模块通信实战《精讲》
  • 【网络篇】TCP知识
  • 嵌入式驱动开发详解13(IIC驱动架构实现)
  • 掌握小程序地理位置服务插件,让用户体验再升级