说我有这样定义的视图模型
public class DataVM
{
public int number { get; set; }
public string name { get; set; }
}
然后在我的代码中的某个地方,我想这样做来填充DataListbox
:
List<DataVM> data = new List<DataVM>();
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]))
中且该项应评估为true,此行DataListbox
也会始终评估为false。我不明白为什么它不起作用。
我在这里做错了什么,如何解决?
答案 0 :(得分:4)
您的代码始终评估为false的原因是,在使用检查两个对象的相等性时,.NET框架默认情况下比较指向内存的指针而不是变量内容。 因此,如果项目已经添加到列表框中,您应该遍历列表框的所有元素并通过比较唯一属性来检查,而不是使用内置的包含功能:
您必须执行以下操作(使用LINQ;将数据[i]。名称和项目。值替换为唯一属性):
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]);
}
}
答案 1 :(得分:0)
包含方法使用正在检查的类的等于方法。
在这种情况下, 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 ;
}
}
当您覆盖等于方法时,您还必须覆盖 GetHashCode 方法
答案 2 :(得分:0)
你无法匹配自己的课程。即使属性相同,它也不是同一个对象(在你的情况下它不是同一个DataVM)。这就像试图将你的蓝色车与其他车匹配,baisicaly它是相同的但是检查的位置是不同的。 尝试匹配对象的属性或编写自己的函数。 (我做了一个功能)
List<DataVM> data = new List<DataVM>();
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<DataVM> DataVMList, DataVM myDataVM)
{
foreach (var dataVm in DataVMList)
{
if (dataVm.number == myDataVM.number && dataVm.stringname == DataVM.stringname)
{
return true;
}
}
return false;
}
答案 3 :(得分:0)
我无法回复之前的回答,但这是我应该相信的版本
bool listContainsItem = DataListbox.Items.Cast<DataVM>().Any(item => item.Value == data[i].name);
它错过了演员...