Как я могу сделать Observable Hashset в C #? - PullRequest
15 голосов
/ 09 февраля 2009

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

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

Ответы [ 3 ]

14 голосов
/ 09 февраля 2009

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

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

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);
    }
}
11 голосов
/ 14 февраля 2012

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

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

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

11 голосов
/ 09 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...