Как работает ListView.ItemCollection.Contains ()? - PullRequest
2 голосов
/ 25 марта 2010

Я копирую ListViewItems из одного ListView в другой, sth. как:

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 () определяет, существует ли элемент?

Как нужно инициализировать ListViewItems, чтобы ListView.ItemCollection. Contains () ( not ListView.ItemCollection.ContainsKey ()) мог их идентифицировать?

1 Ответ

3 голосов
/ 25 марта 2010

Внутренне ListViewItemCollection использует оператор == для проверки на равенство. Поскольку ListViewItem не переопределяет оператор ==, ListViewItemCollection.Contains сравнивает ссылки. Поскольку вы клонируете свои ListViewItems, ваш вызов Contains всегда будет возвращать false, поскольку вы сравниваете две разные ссылки на объекты.

Edit:

Нельзя добавить один и тот же ListViewItem в два разных ListView, поэтому то, что вы пытаетесь сделать, невозможно с помощью Contains. Вам нужно использовать ContainsKey. В следующем примере Contains вернет true:

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