2

我正在将 ListViewItems 从一个 ListView 复制到另一个,……。像:

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

如果我想使用 ListView.ItemCollection.Contains() 来确定一个项目是否已被复制,我总是会得到错误:

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()不是ListView.ItemCollection.ContainsKey())能够识别它们吗?

4

1 回答 1

3

ListViewItemCollection 在内部使用 == 运算符来测试是否相等。由于 ListViewItem 不会覆盖 == 运算符,因此 ListViewItemCollection.Contains 会比较引用。由于您正在克隆 ListViewItems,因此对 Contains 的调用将始终返回 false,因为您正在比较两个不同的对象引用。

编辑:

您不能将相同的 ListViewItem 添加到两个不同的 ListView,因此您尝试使用 Contains 是不可能的。您需要使用 ContainsKey。在以下示例中,包含将返回 true:

var item = new ListViewItemEquality("Item1");
listView1.Items.Add(item1);
Debug.Assert(listView1.Items.Contains(item1));
于 2010-03-25T10:58:34.227 回答