VB.net:从通用列表中删除项目不起作用

时间:2012-08-29 10:32:47

标签: vb.net .net-3.5

我正在使用VB.net,并尝试从列表中删除对象项,如下所示:

Dim evidenceContentItems As List(Of ContentData) = contentApi.GetList(contentCriteria)

For Each item As ContentData In evidenceContentItems.ToList()

    Dim contentMetaList() As Ektron.Cms.CustomAttribute = metaApi.GetContentMetadataList(item.Id).AttributeList

    For Each metaItem As CustomAttribute In contentMetaList.ToList()

        If metaItem.Value <> "-1" Then                
            evidenceContentItems.Remove(item)
        End If

    Next
Next

如果我在“evidenceContentItems.Remove(contentItem)”命令上放置了一个QuickWatch,它将返回True,但列表中的项目数不会下降,并且该项目实际上没有被删除。

我能想到的另一件事就是创建第二个列表并向其添加有效的项目,但我想了解为什么.remove不起作用(但仍返回True)。

修改

所以似乎通过调用.ToList()我正在复制,因此当我.Remove()我从副本中删除。我添加.ToList(),因为在迭代它时无法从列表中删除项目。

还尝试过:

    For Each item As ContentData In itemsToRemove
        If evidenceContentItems.Contains(item) Then
            evidenceContentItems.Remove(item)
        End If
    Next

我再次从.Remove(项目)获得True返回,但仍然没有计数。

3 个答案:

答案 0 :(得分:2)

Remove不起作用,因为item未在内存中引用与您尝试从列表中删除的对象相同的对象。

一个选项是覆盖Equals类中的GetHashCodeContentData,以便两个对象可以被视为“相等”,即使它们不相同。

您还可以使用RemoveAll方法,该方法不需要更改ContentData类:

evidenceContentItems.RemoveAll(Function(x) x.Id = itemToRemove.Id)

答案 1 :(得分:0)

所以我无法成功从列表中删除项目。最后,我创建了一个新列表来添加项目。我创建了一个名为itemsToShow的新列表:

Dim itemsToShow As New List(Of ContentData)

然后当我循环遍历evidenceContentItems时,我添加了我原本不会删除的项目:

itemsToShow.Add(item)

我得到了关于删除副本的全部内容 - 但在我上面的编辑问题中,我试图从原文中删除但无效。

答案 2 :(得分:0)

这是旧帖子。但是我只想分享对我有用的东西。使用ToArray代替ToList()对我有用。

For Each item As ContentData In evidenceContentItems.ToArray()
    evidenceContentItems.Remove(item)
Next