我想尝试制作一个有效的删除方法来处理列表.这种情况如下:
比如说,我有一个(可能)庞大的名单:
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>人有属性FirstName和LastName.如示例中所示,两个人可能共享相同的FirstName.我需要做的是查看列表并删除所有Davids,例如.
我正在循环查找所有大卫,添加到列表DeletePerson,然后再次循环每个DeletePerson并删除.我相信会有更有效的方法吗?效率在这个应用程序中并不重要,但它似乎是一个漫长的方式来做到这一点,我想,因为在第一个名字的字母D之后我们知道我们不会再添加到DeletePerson列表中(假设列表是按字母顺序排序)
谢谢!
更新的答案:
如果我们不允许使用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在我做之前发布了这个想法.)