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行,虽然它不相同....
答案 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列中具有相同值的任何项。