C# 删除ObservableCollection中的一项

C# 删除ObservableCollection中的一项,c#,.net,wpf,C#,.net,Wpf,我有一些方法,比如: public void RemoveItem(ObservableCollection<SomeClass> collection, SomeClass instance) { if(collection.Contains(instance)) { collection.Remove(instance); } } public void removietem(observeCollection集合,SomeClass实例

我有一些方法,比如:

public void RemoveItem(ObservableCollection<SomeClass> collection, SomeClass instance)
{
    if(collection.Contains(instance))
    {
        collection.Remove(instance);
    }
}
public void removietem(observeCollection集合,SomeClass实例)
{
if(collection.Contains(实例))
{
集合。移除(实例);
}
}
首先,即使集合包含实例,
if
语句仍然返回
false

第二,我删除了if语句,只是使集合可以删除实例。执行之后,集合仍然保留其原始项,其中仍然包含实例


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

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

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

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

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


有关msdn的详细信息:

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

public void RemoveItem(ObservableCollection<SomeClass> collection, SomeClass instance)
{
    collection.Remove(collection.Where(i => i.Id == instance.Id).Single());
}
public void removietem(observeCollection集合,SomeClass实例)
{
Remove(collection.Where(i=>i.Id==instance.Id).Single());
}

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

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

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

这是参考问题吗
-可能是的。发布你的完整代码。
集合
实例
来自哪里?您是如何构造集合的?您是否在SomeClass中重新定义了Equals方法?如果(collection.Contains(instance)){collection.Remove(instance);},请不要执行
if(collection.Contains(instance)){collection.Remove(instance);}
。方法
Remove
将为您检查是否有要删除的内容,如果没有,只需返回
false
。也许您应该使用
collection.Remove(collection.SingleOrDefault(i=>i.Id==instance.Id))取而代之。不需要有一个
,其中
后面紧跟着一个
第一个
单个
,等等。在他的原始代码中,似乎
实例
可能不在那里。因此,您不应该使用单个
,如果没有匹配项,它将爆炸。在这两个版本中,都隐式地假定
集合
不包含
null
值的
SomeClass
。是的,谢谢你的这个家伙。。。我很清楚这些事情,但我只是想让这个例子简单一些。对于阅读本文的其他用户,请查看上面的评论。我认为您必须添加
break紧跟在remove语句之后。否则,枚举将继续,这将导致异常,因为集合在
foreach
期间发生了更改。事实上@JeppeStigNielsen,我是在脑子里做的,我错过了它