好吧,我需要检查我的应用程序列表视图中是否存在重复项目,但是......我不知道如何。
检测这种情况的方法是检查字段“Tag”,如果它们相同,则删除该项目。
答案 0 :(得分:5)
查找重复项的一种好方法是使用临时哈希集。这会为您提供 O(n)
O(n log n)
算法(请参阅Rick Sladkeys评论)以检测重复项。例如:
var tags = new HashSet<string>();
var duplicates = new List<Item>();
foreach(Item item in listView.Items)
{
// HashSet.Add() returns false if it already contains the key.
if(!tags.Add(item.Tag)
duplicates.Add(item);
}
[Remove duplicates here]
答案 1 :(得分:2)
使用嵌套for循环来检查每个项目与其他项目。
//tag duplicates for removal
List<Item> toRemove = new List<Item>();
foreach(Item item1 in listView.Items)
{
foreach(Item item2 in listView.Items)
{
//compare the two items
if(item1.Tag == item2.Tag)
toRemove.Add(item2);
}
}
//remove duplicates
foreach(Item item in toRemove)
{
listView.Items.Remove(item);
}
您必须调整代码的语法,但这是它背后的基本思想。此外,可能会对其进行优化,但不要担心这些优化。
答案 2 :(得分:2)
上述所有内容都没有帮助我,所以我想我会发布我想出的内容以防其他人遇到此问题。
myListView是一个ListView,按字母顺序排序(因此在这种情况下重复是相邻的)。如果你愿意的话,你可以事先以编程方式对它进行排序。
myListView.Sorting = SortOrder.Ascending;
无论如何,这是相当简单的,但我希望它可以帮助别人!
for (int i = 0; i < myListView.Items.Count - 1; i++)
{
if (myListView.Items[i].Tag == myListVIew.Items[i + 1].Tag)
{
myListView.Items[i + 1].Remove();
}
}
答案 3 :(得分:0)
如果您有很多项目,那么您可以使用HashSet来保持性能可接受。
将以HashSet开头的项循环为空。对于每个项目,检查标记是否在HashSet中。如果是这样,这是重复的。如果没有将标记添加到HashSet。
这种方法避免了使用嵌套循环得到的N ^ 2算法。 HashSet使得算法线性复杂性提供了删除阶段,并仔细实施。当然,根据您拥有的物品数量,这对您来说无关紧要。如果列表很小,请使用嵌套循环并保持简单。
答案 4 :(得分:0)
如果您要根据特定列比较重复的项目,您应该只使用:
if(listview.Items.Find(SearchQuery).Count > 0)
{
//remove duplicates from list...
}
但是当你填写列表视图时,你应该列出列表中的每个项目。 例如,如果我想在第1 + 2 + 5列中搜索重复项,我会将整行命名为:
myItemName.Name = column1.Text + "_" + column2.Text + "_" + column5.Text;
然后执行上面的“if语句”..
答案 5 :(得分:0)
我想使用词典提供我的解决方案以供将来参考: (您将编辑自己的“Colums”(子项),只需阅读代码即可理解。
我使用下面的内容在按钮点击中删除列表视图中的“Dups”,我正在搜索子项,您可以编辑代码供自己使用...
使用字典和我写的一个简单的“更新”类。
private void removeDupBtn_Click(object sender, EventArgs e)
{
Dictionary<string, string> dict = new Dictionary<string, string>();
int num = 0;
while (num <= listView1.Items.Count)
{
if (num == listView1.Items.Count)
{
break;
}
if (dict.ContainsKey(listView1.Items[num].SubItems[1].Text).Equals(false))
{
dict.Add(listView1.Items[num].SubItems[1].Text, ListView1.Items[num].SubItems[0].Text);
}
num++;
}
updateList(dict, listView1);
}
并使用一点updateList()类......
private void updateList(Dictionary<string, string> dict, ListView list)
{
#region Sort
list.Items.Clear();
string[] arrays = dict.Keys.ToArray();
int num = 0;
while (num <= dict.Count)
{
if (num == dict.Count)
{
break;
}
ListViewItem lvi;
ListViewItem.ListViewSubItem lvsi;
lvi = new ListViewItem();
lvi.Text = dict[arrays[num]].ToString();
lvi.ImageIndex = 0;
lvi.Tag = dict[arrays[num]].ToString();
lvsi = new ListViewItem.ListViewSubItem();
lvsi.Text = arrays[num];
lvi.SubItems.Add(lvsi);
list.Items.Add(lvi);
list.EndUpdate();
num++;
}
#endregion
}
祝你好运!
答案 6 :(得分:0)
int J = 0;
在这个简单的代码中,我们将从循环中删除重复项,该循环将获取第一个项目并将其与下面的项目进行比较,因此如果它存在,则可以删除上面的一个或第二个项目
foreach (ListViewItem item1 in listView1.Items)
{
//J+1 to do not repeat the list from first and remove itself just take a look on next items
for (int i=J+1;i<listView1.Items.Count-1;i++)
{
//i compare two subitems that must be unique in my list
if (listView1.Items[J].SubItems[1].ToString() == listView1.Items[i].SubItems[1].ToString())
// listView1.Items.RemoveAt(i); // remove the second one
listView1.Items.RemoveAt(J); // remove the first one and keep the second
}
J++;
}