从List <object> - RemoveAll或foreach循环中删除项目的速度更快?</object>

时间:2011-08-04 22:28:44

标签: c# .net

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

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

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

谢谢!

编辑:

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

3 个答案:

答案 0 :(得分:16)

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

除了你违反第一个规则的事实(在处理它时修改列表,引导我调用我的第二个口头禅:你不能得到任何更多的未经优化而不是“错误的“),第二个更具可读性, 通常是我的目标。

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

答案 1 :(得分:5)

从10,000件List<string>件中,速度为:

  • for loop:110,000 ticks
  • lambda:1,000 ticks

根据这些信息,我们可以得出结论,lambda表达式更快。<​​/ p>

我使用的源代码可以找到here

请注意,我将foreach替换为for循环,因为我们无法修改foreach循环中的值。

答案 2 :(得分:1)

假设你的意思是

for(int i = 0; i < objects.Count; i++)
{
    if(objects[i].name == "John Smith")
    {
         objects.Remove(objects[i--]);
    }
}
在这种情况下,

RemoveAll会更快。与删除一样,当您已经拥有该职位时,您将再次遍历列表(IndexOf)。

这是List.Remove

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