从List- RemoveAll或foreach循环

本文关键字:RemoveAll foreach 循环 List object | 更新日期: 2023-09-27 18:04:28

对于删除一个对象,其中一个属性等于一个值是更快的?

foreach(object o in objects)
{
    if(o.name == "John Smith")
    {
         objects.Remove(o);
         break;
    }
}

objects.RemoveAll(o => o.Name == "John Smith");

谢谢!

编辑:

我应该提到这是从集合中删除一个对象,然后跳出循环,这可以防止您描述的任何错误,尽管使用带有计数的for循环是更好的选择!

从List<object>- RemoveAll或foreach循环

如果您真的想知道一件事是否比另一件事快,可以对它进行基准测试。换句话说,测量,不要猜测!这可能是我最喜欢的咒语了。

事实上,你打破了第一个规则(在处理过程中修改列表,导致我调用我的第二个咒语:你不能得到比"错误"更不优化的),第二个更可读,这是通常是我的第一个目标。

并且,只是为了完成我的邪恶的三位一体的咒语:首先优化可读性,然后优化速度只在必要的地方:-)

从10,000个项目的List<string>中,速度为:

  • for循环:110,000 ticks
  • lambda: 1,000 ticks

从这个信息,我们可以得出结论,lambda表达式更快。

我使用的源代码可以在这里找到。

请注意,我用for循环代替了foreach,因为我们无法在foreach循环中修改值。

假设你的意思是

for(int i = 0; i < objects.Count; i++)
{
    if(objects[i].name == "John Smith")
    {
         objects.Remove(objects[i--]);
    }
}

RemoveAll在这种情况下会更快。与Remove一样,当您已经有了位置时,您将再次遍历列表(IndexOf)。

这是List。删除

public bool Remove(T item)
{
    int index = this.IndexOf(item);
    if (index >= 0x0)
    {
        this.RemoveAt(index);
        return true;
    }
    return false;
}
相关文章: