2


0

ListView.ItemCollection.Contains()はどのように機能しますか?

ListViewItemsをあるListViewから別のListViewにコピーしています。 好きです:

foreach (ListViewItem item in usersListView.SelectedItems) {
    selectedUsersListView.Items.Add((ListViewItem)item.Clone());
}

ListView.ItemCollection.Contains()を使用して、アイテムが既にコピーされているかどうかを判断する場合、常にfalseになります。

foreach (ListViewItem item in usersListView.SelectedItems) {
    if (!selectedUsersListView.Items.Contains(item) { // always !false
        selectedUsersListView.Items.Add((ListViewItem)item.Clone());
    }
}

私は私の問題を解決するために次のことをしました:

foreach (ListViewItem item in usersListView.SelectedItems) {
    ListViewItem newItem = (ListViewItem)item.Clone();
    newItem.Name         = newItem.Text;

    if (!selectedUsersListView.Items.ContainsKey(newItem.Name) { // this works
        selectedUsersListView.Items.Add(newItem);
    }
}

したがって、これで私の問題が解決することは問題ありませんが、ListView.ItemCollection.Contains()が機能しない理由はまだわかりません…​

ListView.ItemCollection.Contains()は、アイテムが既に存在するかどうかをどのように識別しますか?

ListView.ItemCollection。* Contains() Not * ListView.ItemCollection.ContainsKey())がそれらを識別できるように、ListViewItemをどのように初期化する必要がありますか?

1 Answer


3


内部的に、ListViewItemCollectionは==演算子を使用して等価性をテストします。 ListViewItemは==演算子をオーバーライドしないため、ListViewItemCollection.Containsは参照を比較します。 ListViewItemsを複製しているため、Containsの呼び出しは、2つの異なるオブジェクト参照を比較しているため、常にfalseを返します。

編集する

同じListViewItemを2つの異なるListViewに追加することはできないため、Containsを使用して実行しようとしていることはできません。 ContainsKeyを使用する必要があります。 次の例では、Containsはtrueを返します。

var item = new ListViewItemEquality("Item1");
listView1.Items.Add(item1);
Debug.Assert(listView1.Items.Contains(item1));