Почему ConcurrentDictionary.TryRemove требует второго аргумента? - PullRequest
46 голосов
/ 19 сентября 2011

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

Нужно ли мне просто хранить ее во временной локальной переменной, не использовать ее, и сборщик мусора собирает ее по окончании метода? Кажется довольно глупо ..

Функция: http://msdn.microsoft.com/en-us/library/dd287129.aspx

Ответы [ 3 ]

26 голосов
/ 19 сентября 2011

Вы можете создать именно тот метод, который вам нужен:

public static class ConcurrentDictionaryEx {
  public static bool TryRemove<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> self, TKey key) {
    TValue ignored;
    return self.TryRemove(key, out ignored);
  }
}

ОБНОВЛЕНИЕ : Или, как указано в комментариях Диалектик , просто используйте Remove. Но обратите внимание, что, поскольку это явная реализация интерфейса, вам понадобится ссылка на IDictionary<TKey, TValue>, которая возвращает вас к созданию метода расширения, если вы хотите избежать приведения ссылки ConcurrentDictionary<TKey, TValue>:

public static class ConcurrentDictionaryEx {
  public static bool Remove<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> self, TKey key) {
      return ((IDictionary<TKey, TValue>)self).Remove(key);
  }
}
24 голосов
/ 21 марта 2018

C # 7 добавлено удаление синтаксического сахара

Так что теперь вы можете написать:

dictionary.TryRemove(entry.Key, out _); 

Ссылка

Мы также разрешаем "отбрасывать" как наши параметры, в виде _, позволяют игнорировать параметры, которые вам не нужны:

p.GetCoordinates(out var x, out _); // I only care about x

7 голосов
/ 12 декабря 2016

Если вас не интересует значение, которое было удалено, просто позвоните IDictionary.Remove(key).Он затенен, поэтому вы должны вызывать его явно.

Пример:

var dict = new ConcurrentDictionary<string, string>();
dict.AddOrUpdate("mykey", (val) => "test", (val1, val2) => "test");
((IDictionary)dict).Remove("mykey");

Метод TryRemove(key, out value) предназначен для того, чтобы дать вам обратную связь, если операция внесла какие-либо изменения.Используйте тот, который лучше всего соответствует вашим потребностям.

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