如何删除listview中的重复项?

时间:2011-05-15 20:42:43

标签: c# listview duplicates

好吧,我需要检查我的应用程序列表视图中是否存在重复项目,但是......我不知道如何。

检测这种情况的方法是检查字段“Tag”,如果它们相同,则删除该项目。

7 个答案:

答案 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++;
        }