快速清除以下列表或适当的.NET集合的方法

时间:2012-11-17 06:13:38

标签: c# .net data-structures collections

我需要一种只能按顺序访问的快速收集类型。它需要快速添加和快速清除。我认为有一些集合类型可以用很少的处理时间清除。

我已经读过List<>是O(n)操作。是否有具有超快速清晰能力的集合类型?可能堆叠? List<int>List<Double>(非引用类型)是否允许更快的操作?

4 个答案:

答案 0 :(得分:4)

O(n)就是你在搜索的时候。如果您使用Enumerable(也许是我不了解该部分的索引器)单步执行列表,那么它将是O(1)查找。 清算也是O(1),只要你没有Remove(T obj)调用Clear()将非常快。清算仍然是O(n)。

如果您不需要resizeablity,只需声明一个数组将有一个O(1)索引器并“清除”它,您只需取消引用它并创建一个新的。

答案 1 :(得分:2)

如果你的主要目标是O(1)for clear - 只要有任何合适的集合(List,LinkedList,Array)作为你的cusomt类的成员,实现IListICollection并转发索引/迭代到那个成员。要实现清楚的简单,请创建该内部成员的新实例。

class FastClearList<T> : IList<T>
{
  List<T> inner = new List<T>();

  public void Clear()
  {
     inner = new List<T>(); // recreating list here will give O(1)
  }

  public IEnumerator<T> GetEnumerator()
  {
     return inner.GetEnumerator();
  }
  // forward everything else ...
}

答案 2 :(得分:2)

如果你真的需要快速清除并且不想每次都分配新的内存,你也可以编写自己的IList<T>实现,其中Clear为O(1通过简单地将内部计数器重置为0. List<T>类保留一个_size计数器,用于确定列表当前的位置,重置您可以在您自己的实现中将其设置为0。内部数组实际上不会被清除,但添加到列表中的任何项都将覆盖旧值,并且枚举不会继续超过_size,因此您将不会触及旧值。

基本上,您希望List<T> Count可设置为0而不是gettable。

但请注意,如果T是引用类型,则此类列表将保留对旧值的引用,并防止它们被垃圾回收。因此,如果您想存储价值类型,也许最好使用。

答案 3 :(得分:0)

列表确实需要清除对已清除对象的引用。最好的方法是创建一个新的List&lt;&gt;而不是清除它,或者创建一个实现这种方法的包装器/工厂。