2017-04-14 85 views
0

誰かがリストビューから重複を削除するためのより迅速で優れた方法を持っていますか?私は現在、このようにしています:アイテムをアルファベット順にソートし、次にアイテムをチェックし、それを上のアイテムと比較します。vb.net listviewから重複を削除する最速の方法は?

これは時間がかかります。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) 

はその後HashSetからListViewに項目を設定します。

+0

このコードでは2つのエラーが発生します。 1) 'Select'は 'System.Windows.Forms.ListView.ListViewItemCollection'のメンバーではありません。 2)狭い変換なしでアクセス可能な 'New'を呼び出すことができないため、オーバーロードの解決に失敗しました: – Anders

+0

@アンダー - 'ListViewItem'に項目をキャストしてから' Select'を使用する必要があります - 更新された回答を確認する – Fabio

+0

新しい項目を保存しますユニークな値に?私はそれをテストしていますが、実際には動作していないようです。 – Anders

0

ここでは、item.Textに基づいて異なるアイテムを取得し、アイテムを並べ替えるためのLinqベースのソリューションです。ソートが不要な場合は、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 
関連する問題