Удаление нескольких элементов из ConcurrentDictionary на основе условного ключа - PullRequest
0 голосов
/ 17 сентября 2018

Допустим, у меня есть 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.TryAdd("2_someA_someB_someC", obj2);
dict.TryAdd("3_someA_someB_someC", obj3);

Ответы [ 4 ]

0 голосов
/ 17 сентября 2018

Вы можете использовать Split, чтобы разделить ключ на массив по символу _, преобразовать первый элемент в результирующем массиве в int (обратите внимание, что этот ключ будет выброшен, если ключ не начинается с int), и если оно меньше 2, удалите его из словаря:

foreach (var item in dict.Where(kvp => int.Parse(kvp.Key.Split('_')[0]) < 2))
{
    SomeObject tempObject;
    dict.TryRemove(item.Key, out tempObject);
}
0 голосов
/ 17 сентября 2018

Вам нужно будет выполнить итерацию по словарю, собирая ключи, которые соответствуют критериям, а затем выполнить итерацию по этому списку ключей, удаляемых из словаря. Функция for-each в словаре возвращает элементы со свойствами Key и Value, поэтому вы можете проверить свойство Key, чтобы решить, удалять или нет. Вы не можете удалить в том же цикле, так как это приведет к ошибке.

0 голосов
/ 17 сентября 2018

Предполагая, что он всегда имеет этот формат, вы можете использовать LINQ:

var keysToRemove = dict.Keys.Where(key => int.Parse(key.Remove(key.IndexOf('_'))) < 2).ToList();
keysToRemove.ForEach(key => dict.TryRemove(key, out someObject obj));

String.Remove удаляет часть, начиная с _, а затем анализирует оставшуюся первую часть, число.Он будет выбирать только те ключи, число которых меньше 2. Этот список будет использоваться для удаления элементов из словаря.Конечно, вам нужен замок, чтобы сделать этот потокобезопасным.

0 голосов
/ 17 сентября 2018
  1. Разобрать число, которое стоит перед первым подчеркиванием (Совет: IndexOf и Substring)
  2. Преобразовать его в целое число (Совет: int.TryParse)
  3. Сравнить число со значением (в данном случае 2)
  4. Отфильтруйте ключи, применяя этот метод, сохраните их в коллекции. Выполните итерацию по коллекции и вызовите метод TryRemove, чтобы удалить записи, связанные с ключом.
...