繁体   English   中英

从列表中删除项目更快 <object> -RemoveAll或foreach循环?

[英]Which is faster for removing items from a List<object> - RemoveAll or a foreach loop?

要删除属性等于值更快的对象?

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

要么

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

谢谢!

编辑:

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

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

以及您在第一个规则中违反规则的事实(在处理过程中修改列表,导致我调用第二个咒语:第二个咒语是“没有错” ),第二个更具可读性, 通常是我的首要目标。

而且,只是为了完成我的邪恶三位一体的咒语: 首先针对可读性进行优化,然后仅在必要时才对速度进行优化 :-)

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

  • for循环:110,000个滴答
  • lambda:1,000滴答声

从这些信息,我们可以得出结论,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.Remove

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM