Как я могу создать Observable Hashset в С#?

В настоящее время я использую ObservableCollection в приложении WPF, приложение является реализацией игры жизни Conway и хорошо работает около 500 ячеек, но после этого оно начинает значительно замедляться. Я изначально написал приложение, используя HashSet, но не смог найти способ привязать ячейки к холсту.

Есть ли способ заставить мой HashSet уведомить об обязательном объекте изменений? Мой класс Cell - это простая целая пара X, Y, если пара существует, ячейка живая, в противном случае мертва. Ячейка реализует INotifyPropertyChanged и переопределяет GetHashCode и Equals. Я не мог заставить ячейку отображать какие-либо изменения, только ячейки, присутствующие сразу после загрузки. Есть ли способ привязать хэш-элемент к элементам на холсте?

Ответы

Ответ 1

Вам нужно реализовать INotifyCollectionChanged, и тогда все должно работать нормально. Там еще один соответствующий SO-ответ, который использует freezables, чтобы гарантировать, что также будут обрабатываться изменения в базовых сущностях.

Ответ 2

Я не знаю, поможет ли это, но здесь действительно простая реализация "наблюдаемого набора", который я сделал для личного проекта. Это существенно защищает от вставки (или перезаписи) элемента, который уже находится в коллекции.

Если бы вы хотели, вы могли бы просто вернуться из методов, а не выбрасывать исключение.

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);
    }
}

Ответ 3

Я разместил здесь полный ObservableHashSet, который вы можете использовать.

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

Он основан на размышлении о том, как реализуется ObservableCollection, и предоставляет те же проверки безопасности перезагрузки потока.