Search code examples
c#dictionarycollectionsconcurrentdictionary

Why does ConcurrentDictionary.TryRemove require a second out argument?


I only want to remove a value. I don't need to use the variable afterwards. Why not include an overload where this second parameter was not required?

Do I really have to just store it in a temporary local variable, not use it, and have the garbage collector collect it when the method ends? Seems rather silly..

The function: ConcurrentDictionary<TKey,TValue>.TryRemove


Solution

  • You can create exactly the method you want:

    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);
      }
    }
    

    UPDATE: Or, as Dialecticus mentioned in the comments, just use Remove. But note that, since it's an explicit interface implementation, you'll need a reference to an IDictionary<TKey, TValue>, which leads you back to creating an extension method if you want to avoid casting a ConcurrentDictionary<TKey, TValue> reference:

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