【问题标题】:Remove one Item in ObservableCollection删除 ObservableCollection 中的一项
【发布时间】:2013-12-05 14:53:37
【问题描述】:

我有一些方法,例如:

public void RemoveItem(ObservableCollection<SomeClass> collection, SomeClass instance)
{
    if(collection.Contains(instance))
    {
        collection.Remove(instance);
    }
}

首先,即使集合包含实例,if 语句仍然返回false

其次,我删除了if语句,只是让集合可以删除实例。并且在执行之后,集合仍然保留其原始项目,其中仍然包括实例。

这是参考问题,但如何解决?我只想从 ObservableCollection 中删除一项并保留其 Observable 功能(这让我感到困惑 here)。

【问题讨论】:

  • Is it the Reference problem - 可能,是的。发布您的完整代码。 collectioninstance 来自哪里?你是如何构建这个系列的?
  • 你有重新定义 SomeClass 中的 Equals 方法吗?
  • 不要做if (collection.Contains(instance)) { collection.Remove(instance); }Remove 方法会检查是否有要删除的内容,如果没有,则直接返回 false

标签: c# .net wpf


【解决方案1】:

您的问题是您试图从集合中删除一个对象该对象不在该集合中。它可能具有相同的属性值,但它不是同一个对象。如果您的对象具有唯一可识别的属性,例如Id,则有一种简单的方法:

public void RemoveItem(ObservableCollection<SomeClass> collection, SomeClass instance)
{
    collection.Remove(collection.Where(i => i.Id == instance.Id).Single());
}

我们的想法是我们从集合中获取 实际 项,然后将其传递给 Remove 方法。

【讨论】:

  • 也许你应该改用collection.Remove(collection.SingleOrDefault(i =&gt; i.Id == instance.Id));。没有必要让Where 直接跟在FirstSingle 等之后。在他的原始代码中,instance 似乎可能不存在。所以你不应该使用Single,如果没有匹配,它会爆炸。在任一版本中,都隐含地假定collection 不包含SomeClassnull 值。
  • 是的,谢谢那个家伙......我很清楚这些事情,但只是试图保持示例简单。对于阅读本文的其他用户,请查看上面的评论。
【解决方案2】:

如果您要删除的项目具有可以与其他项目进行比较的代码/ID 之类的内容,则可以执行以下操作:

foreach (var item in itemSet)
{
  if (item.ItemID == itemToCompareTo.ItemID)
  {
    itemSet.Remove(item);
    break;
  }
}

【讨论】:

  • 我认为您必须在删除语句之后立即添加break;。否则枚举将继续,这将导致异常,因为集合在 foreach 期间发生了变化。
  • 确实@JeppeStigNielsen,我是在脑子里做的,但我错过了
【解决方案3】:

确实,这似乎是一个参考问题。 您可能必须覆盖 Equals(和 GetHashCode)方法,以便 ObservableCollection 能够找到实例,即使它不是同一个引用。

原因是因为 Equals() 方法的默认实现会检查两个对象是否具有相同的引用。

注意:重写 Equals 方法时要小心。您还必须重写 GetHashCode,因为 GetHashCode() 方法的默认实现基于对象的引用返回一个整数,而不是基于对象的实例(和类)变量的值。

无论其实例变量(数据字段)的值改变多少次,默认实现计算的哈希码在对象的生命周期内都不会改变。这就是为什么我们总是在您覆盖 Equals() 方法时实现 GetHashCode()。

在 msdn 上了解更多信息:Object.Equals Method (Object)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多