我正在使用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返回,但仍然没有计数。
答案 0 :(得分:2)
Remove
不起作用,因为item
未在内存中引用与您尝试从列表中删除的对象相同的对象。
一个选项是覆盖Equals
类中的GetHashCode
和ContentData
,以便两个对象可以被视为“相等”,即使它们不相同。
您还可以使用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