迭代List并删除.NET中的其他成员

时间:2009-10-25 06:47:38

标签: .net vb.net list collections data-structures

在使用std::list的C ++中,删除成员是一个简单的事情,可以删除迭代器所指向的内容。 (erase语句返回列表的下一个有效成员。)

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

5 个答案:

答案 0 :(得分:9)

List<T>使用RemoveAll方法,该方法接受谓词并移除项目:http://msdn.microsoft.com/en-us/library/wdka673a.aspx

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 :(得分:4)

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

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

如果您使用IEnumerable<T>,则会因为在迭代时无法更改列表而变得更加困难。

答案 2 :(得分:2)

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

  • 使用好的for(;;)循环遍历您的列表;

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

    var list1 = ...; var list2 = list1.Where(item =&gt;!criteria(item))。ToList();

(我已经在这个样本中使用了C#但你应该可以将它转换为VB)。

答案 3 :(得分:1)

如果你谈论foreach并使用IEnumerator,答案是你在迭代它时无法从IEnumerable中删除任何东西。 唯一的方法是将一些东西(物品的索引)存储在另一个列表中,然后在循环中删除它们

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

“允许您在foreach中间修改基础集合”

答案 4 :(得分:0)

怎么样:

    Dim lst As New List(Of String)

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

另一种解决方案