迭代器的Java模拟,用于从集合中删除对象

本文关键字:集合 删除 对象 用于 Java 模拟 迭代器 | 更新日期: 2023-09-27 18:19:27

在Java中,我可以使用Iterator.remove()方法迭代集合并从中删除一些对象http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html#remove()

这是非常容易处理和自然的。就像你在冰箱里找食物,却扔掉过期的食物一样。如何在c#中执行同样的操作?

我想把iterateclean-up集合放在同一个循环中。

有几个相关的问题,例如如何迭代和更新列表,但我仍然无法在c#

迭代器的Java模拟,用于从集合中删除对象

中找到该操作的确切副本

如果您使用List<T>,有一种方便的方法(RemoveAll)可以做到这一点,它将删除所有与谓词匹配的元素(表示为委托)。例如:

List<Person> people = ...;
people.RemoveAll(person => person.Age < 18);
// Just the adults left now...

这比向后迭代更简单

当然,如果你很乐意创建一个新的列表,你可以使用LINQ:

var adults = people.Where(person => person.Age >= 18).ToList();

仅用于循环计数向后

List<string> collection = new List<String> { "Hello", "World", "One", "Two", "Three"};
collection.Dump("Original List");
for(int i = collection.Count-1; i>=0; i-- )
{
    if (collection[i] == "One"){
        collection.RemoveAt(i);
    }
}
collection.Dump("After deleting");

顺便说一句,这是Knuth书籍中的一个经典例子

编辑:这个例子在LINQPad中运行得很好——用于演示目的。Dump()在VS中不起作用。

在C#中,您可以使用for循环来迭代集合,并在其中删除项-这将适用于IList<T>集合。

为了安全起见,您应该向后迭代

for(int i = coll.Count - 1; i >= 0; i--)
{
  if(coll[i] == something)
  {
     coll.RemoveAt(i);
  }
}

如果您可以使用LINQ,请按照Jon Skeet的建议查看RemoveAll。这将允许您从列表中删除所有项,而无需迭代,只需提供一个谓词。

coll.RemoveAll(i => i == something);