代码之家  ›  专栏  ›  技术社区  ›  Cody C

在vb.net中从列表(t)中删除项失败

  •  5
  • Cody C  · 技术社区  · 16 年前

    我有一个通用列表,我正在删除不使用的项 List.Remove(Object) . 我一直在删除项目,但每当我到了第五个项目,我删除它失败,并没有从列表中删除它。我删除的内容似乎并不重要,但每次我尝试删除五项内容时,第五项内容都会失败。

    List(Of T).Remove ,它没有指定他们用于删除项目的算法。

    5 回复  |  直到 12 年前
        1
  •  12
  •   Ryan Lundy    16 年前

    Remove .Equals Equals 方法并将您的逻辑放在那里。

    然而,另一个好的选择是使用 RemoveAll 并传入一个匿名委托或lambda表达式,其中包含要查找的条件。例如。:

    customers.RemoveAll(customer => customer.LastName.Equals(myCustomer.LastName));
    

    当然,只有当您真的想删除时,这才有效 全部的 匹配项,和/或如果您确定只有一个匹配项。

        2
  •  2
  •   Jeffrey Hines    16 年前

        3
  •  0
  •   Shawn Steward    16 年前

    你的单子上有多少项?你是如何移除它们的,只是循环通过?请记住,这些是基于0的列表。如果您使用整数执行任何类型的For循环,则在删除项时可能无法工作。

        4
  •  0
  •   Community Mohan Dere    9 年前

    作为一般规则,不应修改正在循环的集合,而应仅修改该集合中的项。在for-each循环中删除项目的问题是,它会更改正在循环的集合,并干扰列表计数和迭代位置。

    常见的解决办法是:

    1. 创建新集合,以便可以修改一个集合并在另一个集合上循环。

    向后循环:

    Collection(Of T) (你可以用 List(Of T) RemoveAll 基本上做同样事情的方法)。

    <Extension()>
    Public Sub RemoveEach(Of T)(ByRef col As Collection(Of T),
                                ByVal match As Func(Of T, Boolean))
        For i = col.Count - 1 To 0 Step -1
            If match(col(i)) Then col.RemoveAt(i)
        Next
    End Sub
    

    Dim col = New Collection(Of Integer)({1, 2, 3, 4}.ToList)
    col.RemoveEach(Function(i) (i Mod 2) = 0)
    'Produces list of 1 & 3
    

    创建新集合:

    更有效的方法是跟踪集合索引并使用 RemoveAt Remove 它获取一个对象,然后检查集合的其余部分是否与该对象匹配。但是,如果您确实想要一种方法来处理在For循环中删除项,那么可以调用 ToList 在原始集合上,从而创建一个新列表。然后,您可以在新列表上循环查找需要从原始列表中删除的项目。无论何时找到对象,都可以安全地将其从原始集合中删除,因为当前未对其进行枚举。

    <Extension()>
    Public Sub RemoveEachObject(Of T)(ByRef col As Collection(Of T), 
                                      ByVal match As Func(Of T, Boolean))
        For Each o As T In col.ToList()
            If match(o) Then col.Remove(o)
        Next
    End Sub
    

    answer to Remove from a List within a 'foreach' loop .

        5
  •  -1
  •   jose    16 年前

    推荐文章