如何在C#中创建一个Observable Hashset?

Mic*_*ael 16 c# data-binding wpf

目前我在WPF应用程序中使用ObservableCollection,该应用程序是Conway生命游戏的一个实现,适用于大约500个单元格,但之后它开始显着减速.我最初使用HashSet编写应用程序但无法找到将单元格绑定到画布的任何方法.

有没有办法让我的HashSet通知其绑定对象的更改?我的Cell类是一个简单的整数X,Y对,如果该对存在,则该单元处于活着状态,否则死亡.Cell实现了INotifyPropertyChanged并覆盖了GetHashCode和Equals.我无法让细胞显示任何变化,只是加载后立即出现的细胞.有没有办法将Hashset绑定到Canvas上的项目?

Mat*_*ton 15

我不知道这是否会有所帮助,但这是我为个人项目制作的"可观察集" 的一个非常简单的实现.它基本上防止插入(或覆盖)已经在集合中的项目.

如果你想,你可以简单地退出方法而不是抛出异常.

public class SetCollection<T> : ObservableCollection<T> 
{
    protected override void InsertItem(int index, T item)
    {
        if (Contains(item)) throw new ItemExistsException(item);

        base.InsertItem(index, item);
    }

    protected override void SetItem(int index, T item)
    {
        int i = IndexOf(item);
        if (i >= 0 && i != index) throw new ItemExistsException(item);

        base.SetItem(index, item);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 集合定义行为,而不是实现.这是一个集合,但是有一个用于插入,更新,查找的O(n). (15认同)
  • -1因为它不是真正的集合,因为它(在代码隐藏中)使用索引.设置增益性能,因为它们是基于对象引用的.在该实现中,将不会实现相同的性能增益.实际上,表现会更差. (10认同)

MrT*_*lly 11

您还必须实现INotifyCollectionChanged,然后它应该都可以正常工作.还有另一个相关的SO答案,它使用freezables来确保底层实体的更改也得到处理.


Geo*_*Cox 11

我在这里发布了一个完整的ObservableHashSet,您可以使用它.

https://github.com/BellaCode/Public/tree/master/ObservableHashSet

它基于如何实现ObservableCollection并提供相同的线程安全重入检查.

  • `int index = this.hashSet.IndexOf(item);`error`错误1'System.Collections.Generic.HashSet <T>'不包含'IndexOf'的定义,也没有扩展方法'IndexOf'接受第一个参数可以找到'System.Collections.Generic.HashSet <T>'类型(您是否缺少using指令或程序集引用?) (8认同)