是HashSet.ElementAt
O(1)中的实现,如果不是,它是什么?
答案 0 :(得分:4)
不,这是O(n)。 IEnumerable<T>
上的所有扩展方法都必须是O(n)(因为IEnumerable<T>
唯一能做的就是...枚举)。虽然,正如评论中所指出的,它们确实会尝试转换为可以更快地实现操作的接口(例如,ElementAt
将尝试强制转换为IList<T>
以实现O(1 ))。对HashSet<T>
无法实现IList<T>
的情况有帮助。
对于HashSet<T>
,“ElementAt”的概念无论如何都没有意义,因为没有“排序”本身。你基本上只是得到一个随机元素。
答案 1 :(得分:2)
ElementAt
中没有HashSet
方法,因此您可能希望在Enumerable.ElementAt
的实例上使用时了解HashSet<T>
方法的效果。
Enumerable.ElementAt
方法针对实施IList<T>
的类型进行了优化。在那种情况下,性能是O(1)。但是,HashSet不实现此接口,因此性能为O(n)。
答案 2 :(得分:2)
这取决于底层列表类型。反射器显示Enumerable<T>.ElementAt(...)
首先尝试强制转换为IList<T>
。在那种情况下,它将是O(1)。
例如,查询提供程序可能会返回IList<T>
的内容。但是很可能如果你应用任何Linq运算符,它将变成IEnumerable<T>
,因为它们仅使用不同的枚举器构建,并且它将变为O(n)。
编辑:我重读了HashSet
。 HashSet<T>
未实现IList<T>
,因此它是O(n)。