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 が返されますが、リスト内のアイテムの数は減らず、アイテムは実際には削除されません。

他に考えられる唯一のことは、2 番目のリストを作成し、代わりに有効な項目を追加することですが、.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) から True が返されますが、それでもカウントは下がりません。

4

3 に答える 3

2

Removeitemは、リストから削除しようとしているオブジェクトと同じメモリ内のオブジェクトを参照していないため、機能しません。

1 つのオプションは、2 つのオブジェクトが同じでなくても「等しい」と見なすことができるように、クラスでEqualsandをオーバーライドすることです。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 に答える