C# 从列表中删除项目的速度更快<;对象>;-RemoveAll还是foreach循环?

C# 从列表中删除项目的速度更快<;对象>;-RemoveAll还是foreach循环?,c#,.net,C#,.net,用于删除属性等于更快的值的对象 foreach(object o in objects) { if(o.name == "John Smith") { objects.Remove(o); break; } } 或 谢谢 编辑: 我应该提到这是从集合中删除一个对象,然后中断循环,这可以防止您描述的任何错误,尽管使用带有计数的for循环是更好的选择 如果你真的想知道一件事是否比另一件事快,那就对它进行基准测试。换句话说,测量,不要猜测!

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

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

谢谢

编辑:


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

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

事实上,你违反了第一条中的规则(在处理过程中修改列表,导致我引用我的第二条咒语:你不能比“错”更不受欢迎),第二条更具可读性,这通常是我第一条的目标

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

从10000个项目的
列表中,速度是:

  • 循环:110000个滴答声
  • lambda:1000蜱
从这些信息中,我们可以得出结论,lambda表达式更快

我使用的源代码可以找到


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

假设您的意思是

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

第一个将为您提供一个异常,关于在迭代集合时修改集合。。。实际上,对第一种方法的修改(维护一个单独的集合,然后从第一个集合中删除第二个集合中的项目)可能是第二种方法在幕后所做的。当您只希望从集合中删除一个对象(例如,具有给定id)时,foreach循环会起作用,一旦删除了对象,您就可以中断循环,从而防止抛出异常。我同意for循环是更好的选择——谢谢你指出这一点!在这种情况下,两者的行为不同——一个删除单个元素,另一个删除所有匹配的元素。您可能需要修复该链接。它指向顶级URL,我敢肯定我们不想玩“猎狼”来找到您的实际代码:-)您也应该尝试RemoveAt,因为Remove本质上是RemoteAt(IndexOf(o))。这会慢得多。谢谢,这正是我想要的答案——尽管我的例子很垃圾!
for(int i = 0; i < objects.Count; i++)
{
    if(objects[i].name == "John Smith")
    {
         objects.Remove(objects[i--]);
    }
}
public bool Remove(T item)
{
    int index = this.IndexOf(item);
    if (index >= 0x0)
    {
        this.RemoveAt(index);
        return true;
    }
    return false;
}