【问题标题】:C# Is clearing a List<T> with value types still an O(n) operation?C# 清除具有值类型的 List<T> 仍然是 O(n) 操作吗?
【发布时间】:2015-04-25 16:45:50
【问题描述】:

根据 Microsoft documentation,在 List 上调用 Clear() 是一个 O(n) 操作。我猜这是因为如果列表要保存引用,则需要将它们清空。我想知道如果列表具有值类型,Clear() 是否仍然是 O(n) 操作,因为容量没有改变。重置索引指针和计数还不够吗?

我问这个问题是因为在当前的应用程序中,我们使用的列表会在很短的时间内被清除数十万次,并且想知道是否有不同的实现可以让它更快。

【问题讨论】:

  • 一个值类型可以包含一个引用,用户在调用Clear 后会期望该引用消失。在一般情况下,您必须覆盖或重新分配整个底层数组。
  • 调用 new List 并让 GC 处理从内存中删除内容怎么样?可能您可以实现一个扩展来处理“新”(不是新但被覆盖的内容)列表的覆盖和大小,这意味着您永远不会删除。
  • 列表可能不适合您。
  • 您始终可以在数组之上实现自己的 List&lt;T&gt; 等效项。有点样板,但应该不会花很长时间。
  • @Hans 列表的用例是什么?您只需要以一种方式遍历项目吗?如果是这样,拥有 IEnumerable 或链表会便宜得多。

标签: c# arrays performance list


【解决方案1】:

在 List.Clear 方法源代码中检查:

Array.Clear(_items, 0, _size);
_size = 0;

Array.Clear 是一个外部方法 而MSDN关于Array.Clear的声明是:

将数组中的一系列元素设置为每个元素类型的默认值。

所以即使 T 是值类型,它仍然是 O(n) 操作。

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    相关资源
    最近更新 更多