0

我正在尝试对列表视图进行排序,然后删除多余的项目。但是项目既没有正确分类,也没有完全删除冗余。请帮忙..

lvwMessages.Sorting = SortOrder.Descending; 

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

Listview 在运行时包含未排序和冗余的项目

4

2 回答 2

2

您在迭代集合时正在更改集合。这总是有一些有趣的副作用。

EG 假设你有五个项目,分别有 ids 和 tags,

ID0 - Tag1 
ID1 - Tag1 
ID2 - Tag1
ID3 - Tag2
ID4 - Tag2.

第一次通过循环,i = 0,Items 集合有 5 个元素。ID0 与 ID1 进行比较,去除 ID1。

下一次循环,i=1,Items 集合有 4 个元素。现在,不是将 ID0 与 ID2 进行比较,而是将 ID2 与 ID3 进行比较,并且没有任何内容被删除,等等......

你可以使用这样的东西:

int i = 0;
while (i < lvwMessages.Items.Count - 1)
{
   if (lvwMessages.Items[i].Tag == lvwMessages.Items[i + 1].Tag)
      lvwMessages.Items[i + 1].Remove();    
   else
      i++;
}

仅当您没有删除项目时才增加计数器。

于 2012-07-18T09:33:05.600 回答
0

属性Sorting根据项目文本对项目进行排序。如果要基于 对 ListView 中的项目进行排序Tag,则应使用 Sort 方法。Sort 方法使用属性中IComparer指定的ListViewItemSorter对 ListView 中的项目执行手动排序。

下面是一个分拣机的例子:

public class ListViewItemComparer : IComparer
{
    public int Compare(object x, object y)
    {
        YourType a = (YourType)((ListViewItem)x).Tag;
        YourType b = (YourType)((ListViewItem)y).Tag;
        // compare tags
        return a.CompareTo(b);
    }
}

用法:

listView.ListViewItemSorter = new ListViewItemComparer();

如果要更改排序方向,请将结果乘以-1或使用b.Compare(a).

于 2012-07-18T09:33:48.940 回答