【问题标题】:Listbox contains does not find item, cannot remove an item列表框包含未找到项目,无法删除项目
【发布时间】:2013-07-19 04:07:49
【问题描述】:

我将项目添加到列表框中,如下所示:

foreach(myObject object in ListOfObjects)
{
    mylistbox1.add(object);
}

foreach(myObject object in ListOfObjectsTwo)
{
    mylistbox2.add(object);
}

此外,我想在特定条件下删除几个项目。我就是这样做的:

foreach(myObject object in ListOfObjects3)
{
    mylistbox1.items.remove(object);
    mylistbox2.items.remove(object);
}

这似乎只适用于mylistbox1,但不适用于mylistbox2。当我调试时,我可以看到该项目在那里,并且它具有与我要删除的项目完全相同的属性。当我尝试检查列表框是否包含我试图删除的项目时,它返回 false。

我似乎无法理解它。

【问题讨论】:

  • 也许你可以给我们一个初始化你的ListOfObjectsListOfObjectsTwoListOfObjects3的例子?
  • @FSou1 它们是在另一个类中创建的对象,由字符串和布尔值组成。它们被初始化为“ Object o = new Object(string str, bool bl);
  • object 不是有效标识符。
  • myObject 是否实现了它的Equals 方法来比较它的属性?我敢打赌,您将 references 与不同的对象进行比较,即使它们具有相同的属性值。
  • 您应该在myObject 中覆盖Equals,否则Remove 会尝试使用ReferenceEquals 查找对象。引用相等意味着被比较的对象变量引用同一个对象(不仅仅是相等)。

标签: c# object


【解决方案1】:

我 c# 所有以某种方式比较对象所需的列表操作都使用EqualsGetHashCode 方法。在您的情况下Equals 并且默认实现不会检查属性值,它只会验证作为参数对象传递的是否在列表中,因此请考虑您的列表中是否有相同的实例或恰好具有相同属性的两个不同实例. (有用的 VS 选项是 make object id 它会用数字标记实例)

如果是这种情况,那么您应该考虑覆盖 Equals 方法或使用 linq 找到要删除的实例,然后将该对象传递给 Remove 方法。

【讨论】:

  • 我实际上是在比较两个不同的实例。我实现了自己的 equals 方法,它可以满足我的需求。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2010-11-29
相关资源
最近更新 更多