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

时间:2010-07-09 10:19:40

标签: .net generics collections

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

5 个答案:

答案 0 :(得分:23)

简单回答:

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

答案很长:

我们先考虑先找到合适的项目。 Remove方法必须在列表中搜索与给定对象匹配的项目,因此通常为O(n)时间。列表上的RemoveAt可以简单地索引给定的项目,因此O(1)

现在,从列表末尾删除项目当然总是O(1),但一般情况下删除项目需要花费O(n)时间,因为需要进行重新调整(删除后移动项目)一个前进)。因此,在一般情况下,对于Remove和RemoveAt,删除的总时间复杂度分别为O(n) + O(n)O(n) + O(1),因此在任何一种情况下都只是O(n)。但是,RemoveAt保证至少同样快,但缩放是相同的,除非您知道在最后/接近结束时删除它。

答案 1 :(得分:18)

List.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 :(得分:0)

Remove(T)在内部调用RemoveAt(int) 所以,直接做一个removeAt更快。

但是你想要实现什么目标?

答案 3 :(得分:0)

使用System.Diagnostics.Stopwatch()

我本来会创建一个小控制台应用来检查哪个更快。

答案 4 :(得分:0)

鉴于.Net感染了一个向量(或数组),而不是链表,RemoveAt()更快。