Исходный код вики Tools.Collections
Версия 9.1 от Alexandr Fokin на 2020/09/19 19:20
Последние авторы
author | version | line-number | content |
---|---|---|---|
1 | Репозиторий: [[git repo>>https://git.denhome.ru/Repository/Detail/51601bfd-6f2c-40d8-88bb-f2724b294431]] | ||
2 | Platform: NetStandart 1.1 | ||
3 | |||
4 | Данный проект реализует 2 коллекции. | ||
5 | Коллекции представляют из себя Key Value хранилище, являются потокобезопасными. (В основе лежит ConcurrentDictionary) | ||
6 | Для обеспечения оптимистичной блокировки в LinkStorage используется специальный item с полем Stamp, по которому проверяется не был ли изменен элемент во время операции. | ||
7 | (Подробнее смотри ConcurrentDictionary) | ||
8 | |||
9 | **1) LinkItemDictionary** | ||
10 | Интерфейс: | ||
11 | |||
12 | AddLink | ||
13 | TKey key - ключ | ||
14 | Func<TKey, TData> addFactory - фабрика для нового значения | ||
15 | Func<ILinkItem<TKey, TData>, TData> updateFactory - фабрика для обновления существующего значения | ||
16 | |||
17 | Если по ключу нет записи, то | ||
18 | добавить запись | ||
19 | счетчик записи = 1 | ||
20 | вызвать addFactory(если не null) и заполнить value.Data | ||
21 | Иначе если по ключу есть запись, то | ||
22 | Увеличить счетчик на 1 | ||
23 | вызвать updateFactory(если не null) и обновить value.Data | ||
24 | |||
25 | |||
26 | RemoveLink | ||
27 | TKey key - ключ | ||
28 | Func<ILinkItem<TKey, TData>, TData> updateFactory - фабрика для обновления существующего значения | ||
29 | |||
30 | вызвать updateFactory(если не null) и обновить value.Data | ||
31 | Уменьшить счетчик на 1 | ||
32 | Если значение счетчика <= 0 | ||
33 | То удалить запись | ||
34 | |||
35 | |||
36 | **2) ObjectLinkItemDictionary** | ||
37 | Данная коллекция оборачивает LinkItemDictionary, добавляя к контракту сущность объекта, ссылающегося на запись. | ||
38 | Все объекты, ссылающиеся на запись храняться в ImmutableHashSet. | ||
39 | |||
40 | При AddLink, помимо увеличения счетчика в HashSet записи добавляется ссылающийся объект. | ||
41 | При RemoveLink, помимо уменьшения счетчика из HashSet удаляется ссылающийся объект. | ||
42 | |||
43 | Ссылки: | ||
44 | [[Разработка/NET/C#/ConcurrentDictionary>>https://wiki.denhome.ru/bin/view/Разработка/NET/C%23/ConcurrentDictionary/]] | ||
45 | https://stackoverflow.com/questions/39679779/how-to-achieve-remove-if-functionality-in-net-concurrentdictionary | ||
46 |