VB.net:从常规列表中删除项不起作用

VB.net:从常规列表中删除项不起作用,vb.net,.net-3.5,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.G

我正在使用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

我再次从.Remove(item)获得了一个真实的返回,但计数仍然没有下降。

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

Dim itemsToShow As New List(Of ContentData)
然后,当我循环遍历证据内容项时,我添加了一些本来不会删除的项:

itemsToShow.Add(item)

我完全明白了删除副本的意思——但在我上面编辑的问题中,我试图从原件中删除,但没有成功。

remove
不起作用,因为
在内存中引用的对象与您试图从列表中删除的对象不相同

一个选项是覆盖
ContentData
类中的
Equals
GetHashCode
,这样即使两个对象不相同,也可以将它们视为“相等”

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

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

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

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

“项”是一个对象。您从副本中获取项目,但不等于原始项目。请详细介绍
ContentData
。它是值类型还是引用类型?您是否覆盖了
Equals
GetHashCode
?ContentData是来自内容管理系统的对象。我没有跳过Equals或GetHashCode。
For Each item As ContentData In evidenceContentItems.ToArray()
    evidenceContentItems.Remove(item)
Next