循环访问列表并删除 .NET 中的杂项成员

Iterate through a List and remove miscellaneous members in .NET

提问人:Brian Webster 提问时间:10/25/2009 最后编辑:DavidRRBrian Webster 更新时间:2/17/2016 访问量:691

问:

在 C++ 中使用 时,删除成员是擦除迭代器指向的内容的简单问题。(erase 语句返回列表的下一个有效成员。std::list

在 .NET 中,循环访问列表并删除符合特定条件的成员的最佳方法是什么?

。网 vb.net 列表 收集 数据结构

评论


答:

1赞 Ilya Khaprov 10/25/2009 #1

如果您谈论 foreach 并使用 IEnumerator,答案是您在遍历 IEnumerable 时无法从中删除任何内容。 唯一的方法是将某些内容(项目索引)存储在另一个列表中,然后在循环中删除它们

但这是cookie:http://www.koders.com/csharp/fidF2C8E1786AE76101911914CCA9286E25B398AED6.aspx?s=textbox

“允许您在当前过程中修改基础集合”

4赞 Bevan 10/25/2009 #2

假设您有一个 ,一种有效的方法是以相反的顺序遍历列表,并随时删除项目:List<T>

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

如果你有 ,它会变得更加困难,因为你无法在迭代时更改列表。IEnumerable<T>

2赞 elder_george 10/25/2009 #3

在 .NET 中,无法在使用枚举器进行迭代期间修改基础集合。因此,您必须选择:

  • 用良好的循环遍历你的列表;for(;;)

  • 创建一个没有符合您条件的项目的新列表:

    var list1 = ...; var list2 = list1。其中(item => !criteria(item))。列表();

(我在此示例中使用了 C#,但您应该能够将其转换为 VB)。

9赞 Kobi 10/25/2009 #4

List<T>具有取谓词并删除项的方法:http://msdn.microsoft.com/en-us/library/wdka673a.aspxRemoveAll

dinosaurs.RemoveAll(AddressOf EndsWithSaurus)

Private Shared Function EndsWithSaurus(ByVal s As String) _
    As Boolean
    If (s.Length > 5) AndAlso _
        (s.Substring(s.Length - 6).ToLower() = "saurus") Then
        Return True
    Else
        Return False
    End If
End Function

评论

1赞 bobbymcr 10/25/2009
@Soviut:不是线程安全类,方法也不是(它从不锁)。List<T>RemoveAll
0赞 Eric Snyder 10/27/2013 #5

怎么样:

    Dim lst As New List(Of String)

    While lst.Count > 0
        lst.RemoveAt(0)
    End While

另一种解决方案