You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何访问HashSet<T>的内部数组?或支持O(1)增删取随机元素的更优数据结构

核心功能需求
  • 目标数据结构需满足两类操作的O(1)时间复杂度要求:
    • 元素的插入、删除操作
    • 均匀随机获取集合中任意一个元素的操作
方案选型的初始思路与卡点

最初计划选用C#内置的HashSet<T>:它本身的插入、删除操作就是标准常量时间复杂度,只要能直接访问其内部存储元素的数组,只需要生成[0, 存储长度)区间的随机整数作为索引,就能实现O(1)取随机元素的效果。
但该思路存在无法绕开的问题:

  • 没有公开途径可以直接访问HashSet<T>的内部存储数组
  • 如果每次取随机元素时都调用ToArray()生成新数组,会产生O(n)的额外时间开销,完全不符合复杂度要求
对比参考与现存顾虑

对照C#内置Dictionary<TKey, TValue>的实现逻辑,其键集合、值集合的存储是依托内部连续数组的,如果HashSet<T>能提供类似的内部访问能力,就完全匹配需求。
如果临时用Dictionary<TKey, object>模拟实现需求,会存在明显的冗余:

  • 完全用不到字典的键值映射核心能力,功能利用率极低
  • 同等数据规模下,内存占用约是HashSet<T>的两倍,存在不必要的空间浪费
待明确的问题
  • C#中是否存在合法途径可以直接访问HashSet<T>的内部存储数组?
  • 是否存在更适配上述需求、同时没有额外空间浪费的现成数据结构实现?

内容的提问来源于stack exchange,提问作者niodev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 02:45:04