List<T>.Remove(T)
比.NET集合中的List<T>.RemoveAt(int)
方法快吗?值类型或引用类型的速度是否不同?
答案 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()更快。