Вы направились в правильном направлении.Я бы сказал, что вы должны кэшировать общие пересечения в других HashSet<T>
экземплярах, чтобы еще больше ускорить и упростить вещи.
однако, если объект удален из коллекции, все индексы после этой точки теперь неверны.
Хотя вы можете создать обратный словарь Dictionary<int, HashSet<string>>
вЧтобы удалить данный объект из индекса тега, чтобы избежать итерации всего индекса при удалении какого-либо объекта:
var tags = objectTagMap[394]
foreach(var tag in tags)
tagObjectMap[tag].Remove(394)
В любом случае, если вы думаете об индексе в памяти, почему бы вам неиспользовать Redis ?Redis предоставляет вам как хеши (словари), наборы и отсортированные наборы (так и некоторые другие структуры данных).
Это очень очень упрощенный пример того, как вы будете строить ту же стратегию в Redis:
# Store objects as key-value pairs
set object:1 { "id": 1 }
set object:2 { "id": 2 }
set object:3 { "id": 3 }
// sadd (set add) to build the tag index
sadd tagA 1 2
sadd tagB 3
// sunion to get object ids from two or more tags
sunion tagA tagB
// mget (multiple get) to get object data from the result
// of sunion concatenating "object:" with each object id
// This is a simple example. In a real world system you would use
// SCAN to avoid bottlenecks and being able to leverage paging.
mget object:1 object:2 object:3