【发布时间】:2015-04-25 16:45:50
【问题描述】:
根据 Microsoft documentation,在 List 上调用 Clear() 是一个 O(n) 操作。我猜这是因为如果列表要保存引用,则需要将它们清空。我想知道如果列表具有值类型,Clear() 是否仍然是 O(n) 操作,因为容量没有改变。重置索引指针和计数还不够吗?
我问这个问题是因为在当前的应用程序中,我们使用的列表会在很短的时间内被清除数十万次,并且想知道是否有不同的实现可以让它更快。
【问题讨论】:
-
一个值类型可以包含一个引用,用户在调用
Clear后会期望该引用消失。在一般情况下,您必须覆盖或重新分配整个底层数组。 -
调用 new List
并让 GC 处理从内存中删除内容怎么样?可能您可以实现一个扩展来处理“新”(不是新但被覆盖的内容)列表的覆盖和大小,这意味着您永远不会删除。 -
列表可能不适合您。
-
您始终可以在数组之上实现自己的
List<T>等效项。有点样板,但应该不会花很长时间。 -
@Hans 列表的用例是什么?您只需要以一种方式遍历项目吗?如果是这样,拥有 IEnumerable 或链表会便宜得多。
标签: c# arrays performance list