代码之家  ›  专栏  ›  技术社区  ›  Michael

如何在C#中创建可观察性哈希集?

  •  18
  • Michael  · 技术社区  · 17 年前

    目前,我正在WPF应用程序中使用ObservableCollection,该应用程序是Conway生命游戏的实现,在大约500个单元格上运行良好,但之后它开始显著减慢。我最初使用HashSet编写应用程序,但找不到任何将单元格绑定到画布的方法。

    有没有一种方法可以让我的HashSet通知其绑定对象更改?我的Cell类是一个简单的整数X,Y对,如果该对存在,则细胞是活的,否则是死的。Cell实现了INtifyProperty,并覆盖了GetHashCode和Equals。我无法让单元格显示任何更改,只能显示加载后立即出现的单元格。有什么方法可以将哈希集绑定到画布上的项目吗?

    4 回复  |  直到 9 年前
        1
  •  16
  •   Matt Hamilton    17 年前

    我不知道这是否有帮助,但这里有一个 真正地 我为个人项目制作的“可观察集”的简单实现。它基本上可以防止插入(或覆盖)集合中已有的项。

    如果你愿意,你可以简单地从方法中返回,而不是抛出异常。

    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);
        }
    }
    
        2
  •  12
  •   Community Mohan Dere    9 年前

    你必须实施 INotifyCollectionChanged 也一样,然后一切都会好起来的。还有另一个相关的SO答案 uses freezables 以确保底层实体的更改也得到处理。

        3
  •  12
  •   Geoff Cox    13 年前

    我在这里发布了一个完整的ObservableHashSet,你可以使用。

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

    它基于对ObservableCollection如何实现的反思,并提供相同的线程安全重新入口检查。