代码之家  ›  专栏  ›  技术社区  ›  abenci

List<T>.Remove(T)或List<T>.RemoveAt(int)方法哪个更快?

  •  11
  • abenci  · 技术社区  · 15 年前

    List<T>.Remove(T) List<T>.RemoveAt(int) .NET集合中的方法?值类型和引用类型的速度不同吗?

    5 回复  |  直到 6 年前
        1
  •  18
  •   DevExpress Team    15 年前

    Remove(T)在其实现中使用IndexOf和RemoveAt(int)。所以List.RemoveAt(int)更快。

    public bool Remove(T item)
    {
        int index = this.IndexOf(item);
        if (index >= 0)
        {
            this.RemoveAt(index);
            return true;
        }
        return false;
    }
    
        2
  •  24
  •   Noldorin    15 年前

    简单回答:

    一般来说, RemoveAt 速度更快,但并不总是很大。

    长话短说:

    Remove 方法必须在列表中搜索与给定对象匹配的项,因此 O(n) 移除 O(1) .

    现在,从列表末尾删除项目总是 O(1) 当然,但一般来说,删除一个项目需要 O(n) 时间,因为需要进行重新洗牌(将移除的项目后的项目向前移动)。因此,在一般情况下,删除的总时间复杂度为 O(n) + O(n) O(n) + O(1) O(n) 无论哪种情况。然而, 移除 虽然缩放是一样的,除非你知道你要在/接近结束时移除它。

        3
  •  0
  •   cRichter    15 年前

    所以,直接做一个removeAt比较快。

    但是你想达到什么目的呢?

        4
  •  0
  •   Ian Ringrose    14 年前

    假设.Net感染的是向量(或数组),而不是链表,那么RemoveAt()会更快。

        5
  •  -1
  •   Sachith Muhandiram    8 年前

    使用 System.Diagnostics.Stopwatch()

    我只需要创建一个小的控制台应用程序来检查哪个更快。