0

我正在使用 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(item) 获得了真正的回报,但计数仍然没有下降。

4

3 回答 3

2

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

一种选择是在类中覆盖Equals和,这样即使两个对象不相同,也可以被认为是“相等的”。GetHashCodeContentData

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

evidenceContentItems.RemoveAll(Function(x) x.Id = itemToRemove.Id)
于 2012-08-29T14:15:17.890 回答
0

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

Dim itemsToShow As New List(Of ContentData)

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

itemsToShow.Add(item)

我了解删除副本的全部内容 - 但在我上面编辑的问题中,我试图从原始文件中删除但无济于事。

于 2012-08-29T13:09:07.917 回答
0

这是一个旧帖子。但我只是想分享对我有用的东西。使用 ToArray 而不是 ToList() 对我有用。

For Each item As ContentData In evidenceContentItems.ToArray()
    evidenceContentItems.Remove(item)
Next
于 2019-05-10T08:36:02.217 回答