【问题标题】:vb.net fastest way to remove duplicates from listview?vb.net 从列表视图中删除重复项的最快方法?
【发布时间】:2017-04-14 15:00:08
【问题描述】:

有没有人有更快更好的方法从列表视图中删除重复项?我目前正在这样做:我按字母顺序对项目进行排序,然后检查下面的项目并将其与上面的项目进行比较。

虽然这很耗时.. 当我在 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

【问题讨论】:

  • 在 for-each 循环中删除项目通常是个坏主意。通常最好处理列表的副本或在循环中以相反的顺序进行。 “缓慢”可能归因于控件试图在每次删除项目时重绘所有内容。见How do I suspend painting for a control and its children?
  • 类似地,使用绑定到数据源的 DataGridView,这样您就可以轻松地检查该数据源,而不是从一开始就添加欺骗。无论如何,管理源代码会更快。控件并非用于数据存储,而是向用户呈现数据的视图
  • @Plutonix 我可能会这样做。

标签: vb.net listview duplicates


【解决方案1】:

使用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

【讨论】:

  • 这段代码出现 2 个错误。 1) 'Select' 不是 'System.Windows.Forms.ListView.ListViewItemCollection' 的成员。和 2) 重载解析失败,因为在没有缩小转换的情况下无法调用可访问的“新”:
  • @Anders - 在使用 Select 之前,您需要将项目转换为 ListViewItem - 检查更新的答案
  • 所以它将新项目存储到uniquesValues?我一直在测试它,但似乎并没有真正起作用。
【解决方案2】:

这是一个基于 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

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2015-10-07
    • 2015-08-02
    • 2015-12-18
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多