首页 > 编程语言 >C# HashSet不要遍历或者使用泛型扩展方法

C# HashSet不要遍历或者使用泛型扩展方法

时间:2022-10-30 13:45:20浏览次数:43  
标签:Slot index set HashSet C# MoveNext 泛型

C#的接口 IEnumerable 定义了 GetEnumerator 方法,它的拓展方法是都是基于这个迭代器实现的。

当我们使用比如,First、Where等泛型方法时,会实例化一个迭代器 Enumerator 包含 属性Current,方法MoveNext()

    public interface IEnumerator
    {
        bool MoveNext();
        Object Current {get;}
        void Reset();
    }

  其中HashSet的MoveNext实现如下:

            public bool MoveNext() {
                if (version != set.m_version) {
                    throw new InvalidOperationException(SR.GetString(SR.InvalidOperation_EnumFailedVersion));
                }
          //遍历每一个slot
                while (index < set.m_lastIndex) {
                    if (set.m_slots[index].hashCode >= 0) {
                        current = set.m_slots[index].value;
                        index++;
                        return true;
                    }
                    index++;
                }
                index = set.m_lastIndex + 1;
                current = default(T);
                return false;
            }

  比如说对HashSet使用First()尝试获取第一个元素,那么它将会生成一个迭代器,从HashSet内部维护的 Slot[] 的 index=0 处开始查找,而由于HashSet的 Slot 是基于哈希算法计算索引位置的,其中的未被哈希命中的Slot都是默认值,也就是空值。这意味着当你调用First函数时,将会从 Slot[] 的头部一直找到第一个不为空的 Slot 进行返回,也就是对 Slot[] 进行了枚举,时间复杂度是O(n)而不是O(1),效率将极大降低。

其它IEnumerable的扩展方法同理。

标签:Slot,index,set,HashSet,C#,MoveNext,泛型
From: https://www.cnblogs.com/leoric/p/16841102.html

相关文章

  • 玩客云 docker安装homeassistant
    dockerpullportainer/portainer:latest dockerrun-d\--name="hass"\--privileged\--restart=unless-stopped\-eTZ='Asia/Shanghai'\-v/home/hass/......
  • ACL配置实验
    一、实验目的1.掌握ACL的分类及作用;2.掌握ACL的配置方法;二、实验的仪器、设备、材料二层交换机、路由器、PC机三、实验内容及实验原理    实验拓扑图:现在需......
  • centos docker 部署.net6项目
    1.生成dockerfile文件FROMmcr.microsoft.com/dotnet/aspnet:6.0ASbaseWORKDIR/appEXPOSE5000#一般情况下必须开放docker容器默认暴露80端口EXPOSE80#......
  • equals和hashCode详解
    equals和hashCode详解http://www.cnblogs.com/Qian123/p/5703507.html阅读目录equals()方法详解hashcode()方法详解Hashset、Hashmap、Hashtable与hashcode()和equa......
  • leetcode-1790-easy
    CheckifOneStringSwapCanMakeStringsEqualYouaregiventwostringss1ands2ofequallength.Astringswapisanoperationwhereyouchoosetwoindices......
  • script写在head与写在body中的区别
    咱先说将Javascript写在head里面的情况吧,如果你要在这里面去操控DOM元素,是会报错的,因为浏览器是先执行head标签里面的内容,在执行时你的DOM元素还没有生成.(使用了windo......
  • Excel 公式、图表以及单元格的操作
    1.公式1.1SUMSUM函数将值相加,可以将单个值、单元格引用或是区域相加,或者将三者的组合相加。例如:=SUM(A1:A3)将单元格A1:A3中的值加在一起,=SUM(A1:A3,B1:B3)将单元格A......
  • TCP/IP分层
    TCP/IP分层TCP/IP网络分层模型TCP/IP协议共有4层,每一层需要下一层的支撑,同时也支撑着上层,顺序就是从下向上链接层:在以太网、Wifi上发送原始数据,工作在网卡的层次,使用M......
  • pikachu xss
    1.反射型XSS(get)输入<script>alert("test")</script>发现有长度限制(maxlength),F12修改对输入框的长度限制,或者直接改url并encode(url为:http://localhost:8080/vul/xss/xs......
  • ARC080 VP 记录
    更好的阅读体验CSP前和grass8woc和black_trees一起VP了一场ARC,进行了一个思路的打开。发现远古场的ARC竟然是和ABC一起开始的,就跟Div.1+Div.2差不多。......