2017-04-14 73 views
0

有沒有人有更快,更好的方式從列表視圖中刪除重複?我目前正在這樣做:我按字母順序排列項目,然後檢查下面的項目並將其與上面的項目進行比較。vb.net從列表視圖中刪除重複項的最快方法?

雖然這很耗時..當我向excel工作表中輸入20.000條記錄並刪除重複記錄時,它需要幾個毫秒,但下面的代碼需要幾個小時來檢查vb.net中的20.000項。有誰知道更快的方法?

Dim max As Integer = ListView2.Items.Count 
    Dim i As Integer = 0 

    For Each item As ListViewItem In ListView2.Items 

     If i = max Then 
      Exit For 
     End If 

     If i > 0 Then 

      If item.Text = ListView2.Items(i - 1).Text Then 
       max -= 1 
       item.Remove() 
       i -= 1 
      End If 
     End If 

     i += 1 

     Label4.Text = "Total domains: " & ListView2.Items.Count 

    Next 
+0

在for-each循環中刪除項通常是一個壞主意。通常最好在一個循環中處理一個副本或者以相反的順序進行。 「緩慢」可能是由於控件試圖重新繪製每個項目的所有內容。請參見[如何暫停控件及其子項的繪畫?](http://stackoverflow.com/q/487661/719186) – LarsTech

+0

同樣,使用綁定到數據源的DataGridView可以輕鬆地檢查源和不要添加愚蠢的開始。無論如何,管理源代碼將會更快。控件不適用於數據存儲,而是將數據的*視圖*呈現給用戶。 – Plutonix

+0

@Plutonix我可能會這樣做。 – Anders

回答

0

使用HashSet它將只接受唯一值。

Dim itemsText = ListView2.Items.Cast(Of ListViewItem).Select(Function(item) item.Text) 
Dim uniquesValues As HashSet(Of String) = New HashSet(Of String)(itemsText) 

然後設置項目從HashSetListView

+0

我用這段代碼得到2個錯誤。 1)'選擇'不是'System.Windows.Forms.ListView.ListViewItemCollection'的成員。 2)重載解析失敗,因爲沒有可縮放的轉換就無法調用可訪問的'New': – Anders

+0

@Anders - 在使用'Select'之前需要將項目轉換爲'ListViewItem' - 檢查更新的答案 – Fabio

+0

因此,它將存儲新項目唯一的價值?我一直在測試它,但似乎並不奏效。 – Anders

0

這是一個基於Linq的解決方案,根據item.Text獲得不同的項目並對項目進行排序。如果不需要排序,則可以刪除OrderBy部件。

Private Shared Sub RemoveDuplicatesAndSort(lv As ListView) 
    Dim distictItems As ListViewItem() = lv.Items.Cast(Of ListViewItem)().Distinct(New LVItemComparer()).OrderBy(Function(item As ListViewItem) item.Text).ToArray 
    lv.BeginUpdate() ' suppress screen updates 
    lv.Items.Clear() 
    lv.Items.AddRange(distictItems) 
    lv.EndUpdate() 
End Sub 

Private Class LVItemComparer : Implements IEqualityComparer(Of ListViewItem) 
    Public Function Equals1(x As ListViewItem, y As ListViewItem) As Boolean Implements IEqualityComparer(Of ListViewItem).Equals 
     Return x.Text.Equals(y.Text) 
    End Function 

    Public Function GetHashCode1(obj As ListViewItem) As Integer Implements IEqualityComparer(Of ListViewItem).GetHashCode 
     Return obj.Text.GetHashCode 
    End Function 
End Class