如何检查项目是否已在ListBox中

假设我有这样定义的视图模型

public class DataVM { public int number { get; set; } public string name { get; set; } } 

然后我的代码中的某个地方我想这样填充DataListbox

 List data = new List(); for (int i = 0; i < data.Count; i++) { if (DataListbox.Items.Contains(data[i])) { //do nothing } else { DataListbox.Add(data[i]); } } 

但是,此行if (DataListbox.Items.Contains(data[i]))总是计算为false,即使该项已经在DataListbox并且它应该计算为true。 我不明白为什么它不起作用。

我在这里做错了什么,我该如何解决?

您的代码始终评估为false的原因是,在使用检查两个对象的相等性时,.NET框架会默认比较指向内存的指针而不是变量内容。 因此,您应该迭代列表框的所有元素,并通过比较唯一属性(如果项目已添加到列表框中)来代替使​​用内置包含函数:

你必须做这样的事情(使用LINQ;替换数据[i] .name和item。 与唯一属性):

 bool listContainsItem = DataListbox.Items.Any(item => item.Value == data[i].name); 

或者使用“旧”编码风格:

 for (int i = 0; i < data.Count; i++) { bool itemAlreadyAdded = false; foreach (var item in DataListbox.Items) { if (item.Value == data[i].name) { itemAlreadyAdded = true; break; } } if (itemAlreadyAdded) { //do nothing } else { DataListbox.Add(data[i]); } } 

Contains方法使用正在检查的类的Equals方法。

在这种情况下, DataVM类需要覆盖Equals方法

 public class DataVM { public int number { get; set; } public stringname { get; set; } public override bool Equals(object obj) { bool areEqual ; areEqual = false ; if((obj != null) && (obj instanceOf DataVM)) { //compare fields to determine if they are equal areEqual = (DataVM(obj)).number == this.number ; } return areEqual ; } public override int GetHashCode() { //calculate a hash code base on desired properties return number ; } } 

覆盖Equals方法时,还需要覆盖GetHashCode方法

你无法匹配自己的课程。 即使属性相同,它也不是相同的对象(在您的情况下,它不是相同的DataVM)。 这就像试图将你的蓝色车与其他车匹配,baisicaly它是相同的但是检查的位置是不同的。 尝试匹配对象的属性或编写自己的函数。 (我做了一个function)

 List data = new List(); for (int i = 0; i < data.Count; i++) { if (ListContainsDataVM(DataListbox.Items, data[i])) { //do nothing } else { DataListbox.Add(data[i]); } } public bool ListContainsDataVM(List DataVMList, DataVM myDataVM) { foreach (var dataVm in DataVMList) { if (dataVm.number == myDataVM.number && dataVm.stringname == DataVM.stringname) { return true; } } return false; } 

我无法回复之前的回答,但这是我应该相信的版本

 bool listContainsItem = DataListbox.Items.Cast().Any(item => item.Value == data[i].name); 

它错过了演员……