Допустим, у меня есть ConcurrentDictionary
:
var dict = new ConcurrentDictionary<string, someObject>();
dict.TryAdd("0_someA_someB_someC", obj0);
dict.TryAdd("1_someA_someB_someC", obj1);
dict.TryAdd("2_someA_someB_someC", obj2);
dict.TryAdd("3_someA_someB_someC", obj3);
<number>_
в ключах увеличивается, и, поскольку это словарь, нет гарантии, что элементы расположены по порядку.
Теперь представьте, что я хочу удалить из словаря все элементы, у которых number
меньше 2
. Я понятия не имею, как будут выглядеть ключи, только то, что они будут иметь префикс с номером, как указано выше.
Как удалить из словаря все элементы, ключ которых начинается со значения меньше 2
?
Например, результирующий dict после этого процесса будет выглядеть так:
dict.TryAdd("2_someA_someB_someC", obj2);
dict.TryAdd("3_someA_someB_someC", obj3);
ConcurrentDictionary
(но не обязательно, в зависимости от того, почему вы используетеConcurrentDictionary
и почему вы удаляете ключи).ImmutableSortedDictionary
— вещь, но она может подходить или не подходить для вашего сценария — опять же, в зависимости от использования. - person Jeroen Mostert   schedule 17.09.2018ValueTuple
достаточно просто в последних версиях C#:var d = new ConcurrentDictionary<(int theNumber, string compoundKey), someObject>(); d.TryAdd((2, "2_someA_someB_someC"), obj0); d.Keys.Where(k => k.theNumber < 2)
.ValueTuple
имеет подходящие реализацииGetHashCode
иEquals
для работы в качестве ключа словаря. Это только оптимизирует парсинг строки и не факт, что нам еще придется пройтись по всем ключам, но этого может быть достаточно. Пользовательский адаптер, который разделяет словари, — это еще куча работы, над которой мне не хочется работать. :-П - person Jeroen Mostert   schedule 17.09.2018