代码之家  ›  专栏  ›  技术社区  ›  Filip Ekberg

HashSet的Enumerable.ElementAt<TSource>O(1)吗?

  •  7
  • Filip Ekberg  · 技术社区  · 15 年前

    实施是否成功 HashSet.ElementAt

    3 回复  |  直到 15 年前
        1
  •  5
  •   Dean Harding    15 年前

    不,是O(n)。上的所有扩展方法 IEnumerable<T> 因为唯一 我能做的就是。。。枚举)。尽管,正如在注释中指出的,它们确实尝试转换到一个可以更快地实现操作的接口(例如, ElementAt 会尽力投出 IList<T> 以实现O(1)操作)。这对我来说没什么帮助 HashSet<T> 但这并没有实现

    为了 哈希集<T> 无论如何,“ElementAt”的概念并没有真正的意义,因为没有“排序”这样的概念。你基本上只是得到一个随机元素。

        2
  •  3
  •   herzmeister    15 年前

    它取决于underyling列表类型。反射器显示 Enumerable<T>.ElementAt(...) 试图投出一个 IList<T>

    例如,查询提供程序可能返回 IList<T> . 但是如果你应用任何一个Linq操作符,它都会变成一个 IEnumerable<T> ,因为它们只是使用不同的枚举数构建的,它将变成O(n)。

    编辑:我读过头了 HashSet HashSet<T> 无法实现 IList<T>

        3
  •  2
  •   Steven    15 年前

    ElementAt HashSet 所以你可能想知道 Enumerable.ElementAt 方法的实例上使用时 HashSet<T>

    这个 方法对实现类型进行了优化 IList<T> . 在这种情况下,性能为O(1)。但是,HashSet没有实现这个接口,因此性能是O(n)。