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();    
}

ソートされていない冗長なアイテムを含む実行時のリストビュー

4

2 に答える 2

2

コレクションを繰り返しながら、コレクションを変更します。それは常にいくつかの面白い副作用があります。

EGそれぞれIDとタグを持つ5つのアイテムがあるとしましょう。

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 に答える