【问题标题】:Remove Duplicate items from listview从列表视图中删除重复项
【发布时间】:2025-12-18 03:25:01
【问题描述】:

我已将来自多个来源的数据绑定到ListView。还有重复数据,我想从ListView 中删除所有重复数据。我使用了以下代码,但没有帮助。

listview.Sorting = System.Windows.Forms.SortOrder.Ascending;
for (int i = 0; i < listview.Items.Count - 1; i++)
{
   if (listview.Items[i].Tag == listview.Items[i + 1].Tag)
   {
      listview.Items[i + 1].Remove();
   }
}

【问题讨论】:

  • 这应该删除重复的条目,这会产生什么结果?
  • 你试过在调试器中单步调试代码吗?
  • 从表面上看,我可以说你不能在迭代时修改集合。这可能会引发错误。一个建议,只需获取重复项的索引并单独删除即可。
  • @prashanth - 如果 OP 使用 foreach 循环,那将是正确的,但事实并非如此。

标签: c# winforms listview


【解决方案1】:

没有a good, minimal, complete code example,就无法确定问题所在。但是,您的 Tag 值很可能是引用类型,而不是实际上相同的对象实例。

假设对象覆盖Equals() 方法,您可以改用该方法来修复它:

listview.Sorting = System.Windows.Forms.SortOrder.Ascending;
for (int i = 0; i < listview.Items.Count - 1; i++)
{
   if (listview.Items[i].Tag.Equals(listview.Items[i + 1].Tag))
   {
      listview.Items[i + 1].Remove();
      i--;
   }
}

请注意,您还有一个错误,如果给定值有三个或更多重复项,您将跳过检查元素。您可以通过在删除元素时减少 i 来解决此问题(见上文)。

【讨论】:

  • 请注意我提供的链接。我为您的代码中最可能出现的错误提供了一个解决方案,但坦率地说......除非您提供适当的代码示例,否则很多人将不得不浪费大量时间,然后才会有人随机偶然发现正确答案,假设曾经完全发生。通过适当的代码示例,可以轻松快速地提供解决方案(假设您在准备代码示例时没有自己发现)。
【解决方案2】:

试试这个,

      for (int i = 0; i < listview.Items.Count; i++) {
            for (int i_ = 0; i_ < listview.Items.Count; i_++) {
                if (listview.Items[i].Tag == listview.Items[i_].Tag) {
                    listview.Items[i_].Remove();
                    i--; break;
                }
            }
        }

如果可能有多个重复项,请删除 break

【讨论】:

  • 不幸的是,您无法更改或删除 foreach 循环内的对象,想看看编辑后的答案有一个错误
最近更新 更多