为什么ConcurrentDictionary.TryRemove需要第二个参数?

Joh*_*ith 48 c# dictionary

我只想删除一个值..之后我不需要使用变量.为什么不包含不需要第二个参数的重载?

我真的必须将它存储在一个临时的局部变量中,而不是使用它,并在方法结束时让垃圾收集器收集它吗?看起来很傻..

功能:http://msdn.microsoft.com/en-us/library/dd287129.aspx

rob*_*das 34

C#7添加了丢弃语法糖

所以现在你可以写:

dictionary.TryRemove(entry.Key, out _); 
Run Code Online (Sandbox Code Playgroud)

参考

我们允许"丢弃"作为输出参数,以_的形式,让你忽略你不关心的参数:

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


Jor*_*dão 26

您可以创建所需的方法:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:或者,正如评论中提到的Dialecticus,只需使用Remove.但请注意,由于它是一个显式的接口实现,因此您需要对an的引用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);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 呃..为什么这不包含在框架中?我更好奇为什么他们不会默认包含它. (4认同)
  • @JohnSmith,如果你想获取值并同时删除密钥,则使用TryRemove.如果您不关心该值,那么只需使用Remove. (4认同)
  • @MarzSocks:这些被称为[扩展方法](https://msdn.microsoft.com/en-CA/library/bb383977.aspx).读一读! (3认同)
  • 我刚刚尝试了这个解决方案 - 我的工作效果非常棒,但这个代码的工作原理对我来说是新的.你能解释一下ConcurrentDictionary如何通过仅仅将self作为arg来"扩展"它吗?是否有某种文章解释这个概念? (2认同)
  • 我在多线程情况下使用 ConcurrentDictionary 所以我想知道使用 IDictionary 的 remove 方法是否安全? (2认同)

and*_*fox 7

如果您对删除的值不感兴趣,只需致电IDictionary.Remove(key).它被遮蔽了,所以你必须明确地调用它.

例:

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

TryRemove(key, out value)方法可以为您提供有关操作是否进行任何更改的反馈.使用最适合您需求的那个.

  • @Jacob 它继承自 IDictionary,因此该方法必须存在。我添加了一个如何调用阴影方法的示例。 (2认同)
  • 谢谢,这很有帮助。 (2认同)