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

发布于 2024-09-09 06:09:13 字数 116 浏览 1 评论 0原文

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

Is List<T>.Remove(T) faster than the List<T>.RemoveAt(int) method in .NET collections? Is speed different for value types or reference types?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

流年已逝 2024-09-16 06:09:13

简单答案:

一般来说,RemoveAt 更快,但并不总是那么快。

长答案:

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

现在,从列表末尾删除一个项目当然总是O(1),但通常删除一个项目需要O(n)时间,因为重新洗牌需要待完成(将移除的一项向前移动)。因此,在一般情况下,移除的总时间复杂度为 O(n) + O(n)O(n) + O(1)(对于移除)和RemoveAt,因此无论哪种情况都只需O(n)。然而,RemoveAt 保证至少同样快,尽管缩放是相同的,除非您知道要在结束时/接近结束时删除它。

Simple answer:

In general, RemoveAt is quicker, though not always hugely.

Long answer:

Let's just consider finding the appropiate item first. The Remove method has to search the list for the item that matches the given object, and is thus O(n) time in general. RemoveAt on a list can simply index the given item, and is thus O(1).

Now, removing an item from the end of a list is always O(1) of course, but in general removing an item takes O(n) time, because reshuffling needs to be done (moving items after the removed one forward). Therefore, in the general case, the total time complexity for removal is either O(n) + O(n) or O(n) + O(1) for Remove and RemoveAt respectively, hence simply O(n) in either case. However, RemoveAt is guaranteed to be at least as quick, though scaling is the same unless you know you're removing it at/near the end.

别挽留 2024-09-16 06:09:13

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;
}

List.Remove(T) uses IndexOf and RemoveAt(int) in its implementation. So List.RemoveAt(int) is faster.

public bool Remove(T item)
{
    int index = this.IndexOf(item);
    if (index >= 0)
    {
        this.RemoveAt(index);
        return true;
    }
    return false;
}
第七度阳光i 2024-09-16 06:09:13

Remove(T) 在内部调用RemoveAt(int)
所以,直接执行removeAt会更快。

但你想实现什么目标?

Remove(T) makes internally a call to RemoveAt(int)
so, doing directly a removeAt is faster.

But What do you want to achieve?

聚集的泪 2024-09-16 06:09:13

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

Given that a .Net is infect a vector (or array), not a linked list, RemoveAt() is quicker.

囚你心 2024-09-16 06:09:13

使用 System.Diagnostics.Stopwatch()

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

Use System.Diagnostics.Stopwatch()

I would have just created a little console app to check which is faster.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文