无法在listview子项目之间进行比较并删除重复的vb.net

时间:2013-12-11 03:22:52

标签: vb.net

Dim hTable As Hashtable = New Hashtable()
Dim duplicateList As ArrayList = New ArrayList()
Dim itm As ListViewItem

For Each itm In ListView1.Items
    If hTable.ContainsKey(itm.Text) AndAlso 
       hTable.ContainsKey(itm.SubItems(1).Text) AndAlso
       hTable.ContainsKey(itm.SubItems(2).Text) AndAlso
       hTable.ContainsKey(itm.SubItems(3).Text) Then

        'duplicate
        duplicateList.Add(itm)
    Else
       hTable.Add(itm.Text, String.Empty)
    End If
Next

'remove duplicates
For Each itm In duplicateList
    ListView1.Items.Remove(itm)
Next

我想在listview中比较3个子项目,如下所示:

  

DATE_的 _ ___ 名称 _ __ _ _ < /强> _Value

     

一十二分之一十一/ 13_的 __ llallala _ __ _ _ _12334

     

一十二分之一十一/ 13_的 __ llallala _ __ _ _ _12334

     

一十二分之一十一/ 13_的 __ ddsfvxcv _ ____ _16542

     

一十二分之十三/ 12_的 __ ddsfvxcv _ ____ _12334

     

10次/ 12 / 13_的 __ owowewe _ ____ _23024

然后通常会删除第一行和第二行,因为它是重复但现在它不能.... sry for bad english

~~~~~~~~~~~~~~~~~~~修订~~~~~~~~~~~~~~~~~~~~

Dim hTable As Hashtable = New Hashtable()
    Dim duplicateList As ArrayList = New ArrayList()
    Dim itm As ListViewItem
    On Error Resume Next
    For Each itm In ListView1.Items
        If hTable.ContainsKey(itm.Text) AndAlso hTable.ContainsKey(itm.SubItems(1).Text) AndAlso hTable.ContainsKey(itm.SubItems(2).Text) AndAlso hTable.ContainsKey(itm.SubItems(3).Text) Then 'duplicate
            duplicateList.Add(itm)
            duplicateList.Add(itm.SubItems(1))
            duplicateList.Add(itm.SubItems(2))
            duplicateList.Add(itm.SubItems(3))
        Else
            hTable.Add(itm.Text, String.Empty)
            hTable.Add(itm.SubItems(1).Text, String.Empty)
            hTable.Add(itm.SubItems(2).Text, String.Empty)
            hTable.Add(itm.SubItems(3).Text, String.Empty)
        End If
    Next
    'remove duplicates
    On Error Resume Next
    For Each itm In duplicateList
        ListView1.Items.Remove(itm)
    Next

我把On错误恢复到下一个所以问题“解决”

但现在代码运行不稳定....

我的意思是重复可以删除但有些非重复它也删除.....

像:

---- DATE_的 _ ___ 名称 _ __ _ _ _Value

1 ---一十二分之一十一/ 13_的 __ llallala _ __ _ _ < /强> _12334

2 ---一十二分之一十一/ 13_的 __ llallala _ __ _ _ < /强> _12999

3 ---一十二分之一十一/ 13_的 __ ddsfvxcv _ ____ _16542

4 ---一十二分之十三/ 12_的 __ ddsfvxcv _ ____ _12334

5 ---12分之10/ 13_的 __ owowewe _ ____ _23024

它会删除第2行,虽然它不相同....

1 个答案:

答案 0 :(得分:0)

arraylist只包含对象。切换到List(Of ListViewItem)或尝试ListView1.Items.Remove(DirectCast(itm, ListViewItem))

您可能最好建立一个独特项目列表并重新填充列表视图。由于您只想比较2列来测试相等性,因此自定义相等比较器可以在这里工作。这样的事情可能有用:

    Dim hTable As List(Of ListViewItem) = (From lvi In ListView1.Items
                                   Let newlvi = DirectCast(lvi, ListViewItem)
                                   Select newlvi
                                   ).Distinct(New CompareLVI).ToList
    ListView1.Items.Clear()
    ListView1.Items.AddRange(hTable.ToArray)

Public Class CompareLVI
    Implements IEqualityComparer(Of ListViewItem)

    Public Function Equals1(x As ListViewItem, y As ListViewItem) As Boolean Implements IEqualityComparer(Of ListViewItem).Equals
        Return x.Text = y.Text AndAlso x.SubItems(1).Text = y.SubItems(1).Text
    End Function

    Public Function GetHashCode1(obj As ListViewItem) As Integer Implements IEqualityComparer(Of ListViewItem).GetHashCode

        Return obj.Text.GetHashCode Xor obj.SubItems(1).Text.GetHashCode
    End Function
End Class

LINQ表达式创建listviewitems的唯一列表。 distinct方法使用自定义比较器来拒绝前2列中具有相同值的任何项。