C# Java模拟迭代器从集合中删除对象

C# Java模拟迭代器从集合中删除对象,c#,C#,在Java中,我可以使用Iterator.remove()方法迭代集合并从中删除一些对象 这是非常简单和自然的。就像你在冰箱里寻找食物,然后扔掉过期的食物。在c#中如何做同样的事情 我想在同一个循环中迭代和清理集合 有几个相关的问题,例如,我仍然无法在c#中找到此操作的精确副本。在c#中,您可以使用for循环来迭代集合并在其中删除项-这将适用于IList集合 为了安全起见,应该向后迭代 for(int i = coll.Count - 1; i >= 0; i--) { if(coll

在Java中,我可以使用
Iterator.remove()
方法迭代集合并从中删除一些对象

这是非常简单和自然的。就像你在冰箱里寻找食物,然后扔掉过期的食物。在c#中如何做同样的事情

我想在同一个循环中迭代和清理集合

有几个相关的问题,例如,我仍然无法在c#

中找到此操作的精确副本。在c#中,您可以使用
for
循环来迭代集合并在其中删除项-这将适用于
IList
集合

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

for(int i = coll.Count - 1; i >= 0; i--)
{
  if(coll[i] == something)
  {
     coll.RemoveAt(i);
  }
}
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");
如果您可以使用LINQ,请按照Jon Skeet的建议查看。这将允许您从列表中删除所有项目,而无需迭代,只需提供一个谓词

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

只用于循环倒数

for(int i = coll.Count - 1; i >= 0; i--)
{
  if(coll[i] == something)
  {
     coll.RemoveAt(i);
  }
}
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");
List collection=新列表{“你好”、“世界”、“一”、“二”、“三”};
收集、倾倒(“原始清单”);
对于(int i=collection.Count-1;i>=0;i--)
{
if(集合[i]=“一”){
收集、移除(i);
}
}
收集.转储(“删除后”);
顺便说一下,这是一个经典的例子


编辑:这个例子在LINQPad中很好地工作-用于演示目的。Dump()在VS中不起作用。

如果您使用的是
列表
,则有一个简便的方法可以执行此操作(),它将删除与谓词匹配的所有元素(表示为委托)。例如:

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

这可能会导致异常。请注意,此处的键正在按索引删除,并且反向操作不会干扰列表中剩余的待搜索部分。这是一个解决方案,但不太好。Jave有很好的
迭代器
,但在C#中,我必须手动向后迭代…我想要显式的
for
foreach
循环,因为我想对每个项做些事情。在此过程中,我想删除过时的项目。您的建议只删除过时的项目,但不允许我对其余项目进行处理。@javapowered:当然可以。为每个项调用谓词,其返回值控制是否删除该项。可以在谓词内部工作,唯一不能做的就是替换项(但是可以更改引用类型的成员,这将影响集合)。由于您无法处理已删除的项,因此要求您返回以导致删除似乎不是一个问题。@javapowered,另一个示例
var list=new list(){1,2,3,4,5,6};RemoveAll(i=>i%2==0)
在Jon的第一个示例中,如何计算
int TotalageOfaduts=“删除18岁以下的人,所有其他人的年龄总和”
@javapowered,
int-sum=list.Where(p=>p.age>=18).sum(p=>p.age)