2012-08-29 73 views
0

我用的VB.net,我試圖從列表中,像這樣刪除對象項目: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)「命令,它將返回True,但列表中的項目數不會減少,並且該項目實際上未被刪除。

我唯一能想到的其他事情就是創建第二個列表並向其中添加有效的項目,但我想知道爲什麼.remove不起作用(但返回True)。

編輯:

如此看來,通過調用.ToList()我想提出一個副本,因此當我卸下襬臂()我是從拷貝刪除。我添加了.ToList(),因爲在遍歷它時無法從列表中刪除項目。

也試過:

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

我再次得到卸下襬臂(項目)一個真實的回報,但仍算不下去。

+0

「項目」是一個對象。你從副本中獲得物品但不是原來的物品。 –

+1

詳細講解'ContentData'。它是一個值類型還是一個引用類型?你重寫了'Equals'和'GetHashCode'嗎? – sloth

+0

ContentData是來自內容管理系統的對象。我沒有覆蓋Equals或GetHashCode。 –

回答

0

所以我無法成功從列表中刪除一個項目。最後,我創建了一個新列表來添加項目。我創建了一個名爲itemsToShow新的列表:

Dim itemsToShow As New List(Of ContentData) 

接着,當我通過evidenceContentItems循環,我補充一點,我會否則不會刪除項目:

itemsToShow.Add(item) 

我得到有關刪除複製整個事情 - 但在我上面編輯的問題中,我試圖從原來的刪除,但無濟於事。

2

Remove不起作用,因爲item未在內存中引用與您嘗試從列表中刪除的對象相同的對象。

一個選項是覆蓋ContentData類中的EqualsGetHashCode,以便兩個對象可以被視爲「相等」,即使它們不相同。

您還可以使用RemoveAll方法,它不需要更改ContentData類:

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