为列表编写删除名称循环

bar*_*ron 4 c# algorithm list

我想尝试制作一个有效的删除方法来处理列表.这种情况如下:

比如说,我有一个(可能)庞大的名单:

Alex Smith
Anna Hobb
Bertie Blackman
Bill Clinton
David Smith
David Warner
George Jung
George Washington
William Wobbits
Run Code Online (Sandbox Code Playgroud)

让我们说这是一个List<Person>人有属性FirstNameLastName.如示例中所示,两个人可能共享相同的FirstName.我需要做的是查看列表并删除所有Davids,例如.

我正在循环查找所有大卫,添加到列表DeletePerson,然后再次循环每个DeletePerson并删除.我相信会有更有效的方法吗?效率在这个应用程序中并不重要,但它似乎是一个漫长的方式来做到这一点,我想,因为在第一个名字的字母D之后我们知道我们不会再添加到DeletePerson列表中(假设列表是按字母顺序排序)

谢谢!

Mar*_*ers 6

更新的答案:

如果我们不允许使用RemoveAll或为我们完成所有工作的LINQ函数,这是一种更"手动"的方法:

    List<Person> newPersons = new List<Person>();
    foreach (Person person in persons)
    {
        if (person.FirstName != "David")
            newPersons.Add(person);
    }
    persons = newPersons();
Run Code Online (Sandbox Code Playgroud)

在.NET中,新列表的构建速度非常快.逐个删除项目很慢,因为首先必须在列表中找到要删除的每个元素,然后在删除它时,必须向上移动列表的其余部分以填补空白.这比我上面给出的方法要慢得多.

为了使删除操作更快,列表可以按排序顺序保存或按名字分组.但是,最初创建列表的速度会慢一些.


老答案:

您似乎对简洁的解决方案感兴趣,而不是对具有最佳性能的解决方案感兴趣.如果您使用的是.NET 3.5,则可以使用:

persons = persons.Where(person => person.FirstName != "David").ToList();
Run Code Online (Sandbox Code Playgroud)

哦,List有一个RemoveAll方法:

names.RemoveAll(person => person.FirstName == "David");
Run Code Online (Sandbox Code Playgroud)

(注意吉米RemoveAll在我做之前发布了这个想法.)