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

时间:2013-11-29 14:52:03

标签: c# list listbox

说我有这样定义的视图模型

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。我不明白为什么它不起作用。

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

4 个答案:

答案 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);

它错过了演员...