关于C#中的HashSet<T>与List<T>

HashSet<T>

表示值的集合。这个集合的元素是无须列表,同时元素不能重复。由于这个集合基于散列值,不能通过数组下标访问。

List<T>

表示可通过索引访问的对象的强类型列表。内部是用数组保存数据,不是链表。元素可重复,是有序列表,根据调用add的时间先后进行排序。每次添加删除操作会重新排序。例如有100个元素,删除掉下标99的元素后,无法再通过下标99访问数据。

性能分析

HashSet对数据的检索效率(contains函数)比List 快。HashSet存储数据时将数据通过散列函数直接映射到地址,所有取值时可以直接取到,时间复杂度为O(1)。List检索时需要一个个的进行值比较,最多需要比较到数组末尾,时间复杂度为O(n),n为元素个数。

实例分析
cs 复制代码
public static void Test()
{
    int dataCount = 10;  //数据个数
    int loopCount = 10000000; //循环次数

    Stopwatch sw = new Stopwatch();

    HashSet<int> hash = new HashSet<int>();
    List<int> list = new List<int>();
    list.AddRange(Enumerable.Range(0, dataCount)); 
    //list.Select(x => hash.Add(x));

    for (int i = 0; i < dataCount; i++)
    {
        hash.Add(i);
    }


    sw.Restart();
    for (int i = 0; i < loopCount; i++)
    {
        hash.Contains(999999);
    }
    sw.Stop();
    Console.WriteLine("HASH:" + sw.ElapsedMilliseconds);


    sw.Restart();
    for (int i = 0; i < loopCount; i++)
    {
        list.Contains(999999);
    }
    sw.Stop();
    Console.WriteLine("LIST:" + sw.ElapsedMilliseconds);

    sw.Restart();
    for (int i = 0; i < loopCount; i++)
    {
        hash.Add(999999999);
        hash.Remove(999999999); 
    }
    sw.Stop();
    Console.WriteLine("HASH:" + sw.ElapsedMilliseconds);


    sw.Restart();
    for (int i = 0; i < loopCount; i++)
    {
        list.Add(99999909);
        list.Remove(99999909);
    }
    sw.Stop();
    Console.WriteLine("LIST:" + sw.ElapsedMilliseconds);

}

当数据量较小时,list的增加删除性能有优势,当数据量较大,则hashset的性能有巨大优势

数据量10

数据量50

数据量1000

数据量10000

相关推荐
xyq202410 分钟前
Lua 模块与包
开发语言
小短腿的代码世界22 分钟前
打印不止是QPrinter:深入Qt Print Support框架的内核设计与跨平台输出管道
开发语言·qt
性野喜悲22 分钟前
python将excel中的链接转成图片并替换链接展示在excel中【将pdf的第一页插入excel并将对应信息获取到插入签名等位置】
开发语言·python·excel
诙_24 分钟前
C++代码实践应用
开发语言·c++
谙弆悕博士25 分钟前
【附C语言源码】从零实现命令行贪吃蛇游戏
c语言·开发语言·学习·游戏·游戏程序·小游戏·贪吃蛇
Evand J38 分钟前
【无人机编队控制程序4】复杂障碍环境下多无人机编队避障(人工势场法APF)与协同控制,MATLAB仿真例程
开发语言·matlab·无人机·控制·apf·避障
南宫萧幕1 小时前
基于 MATLAB 的插电混动汽车 CD-CS 策略 WLTC 前向仿真实现
开发语言·matlab·汽车
代钦塔拉1 小时前
第一篇:工业级 C++/Qt 项目头文件包含原则:告别循环依赖与编译玄学
开发语言·c++·qt
The Shio2 小时前
OptiByte 操练场:面向 IoT/嵌入式的协议可视化调试工具
网络·嵌入式硬件·物联网·c#·.net·业界资讯·iot