.net ListView.ItemCollection.Contains()如何工作?

.net ListView.ItemCollection.Contains()如何工作?,.net,winforms,listview,listviewitem,.net,Winforms,Listview,Listviewitem,我正在将ListViewItems从一个ListView复制到另一个ListView,例如: foreach (ListViewItem item in usersListView.SelectedItems) { selectedUsersListView.Items.Add((ListViewItem)item.Clone()); } 如果我想使用ListView.ItemCollection.Contains()来确定某个项目是否已被复制,我总是得到false: foreach

我正在将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()如何识别项是否已经存在


ListViewItems必须如何初始化ListView.ItemCollection.包含()不是ListView.ItemCollection.ContainsKey())才能识别它们?

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

编辑: 您不能将同一ListViewItem添加到两个不同的ListView,因此无法使用Contains来执行此操作。你需要使用ContainsKey。在以下示例中,Contains将返回true:

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

那么我真的无法想象.Contains()会返回true的情况。。。你能举个简短的例子吗?