是否有任何实现按键删除并同时获取值?

naw*_*fal 9 .net c# dictionary asymptotic-complexity trygetvalue

我正在做一个性能关键程序(很少学术),我正在寻求尽可能优化(不像它证明"这是"瓶颈).

我有一个自定义字典结构(.NET的包装Dictionary<,>),我会不断删除一个阶段的项目(按Key值).我需要Value删除的项目.现在我必须这样做:

T t;
if !TryGet(key, out t)
   return false;

Remove(key);
Run Code Online (Sandbox Code Playgroud)

这是两次查找.我会喜欢这个:

public bool Remove(S key, out T value)
{
    // implementation
}
Run Code Online (Sandbox Code Playgroud)

我知道框架中没有任何内容,但是某处有实现吗?如果是这样的话,我会用那个更改我的支持词典.

编辑:嗯,我知道这两个TryGetValueRemove是O(1).只知道是否有任何集合结构只能在一次查找中产生相同的效果.正如我所说,我正在努力尽可能地优化.只是知道.

Mar*_*zek 7

Dictionary<TKey, TValue>.TryGetValueDictionary<TKey, TValue>.Remove方法都是O(1)操作,所以我认为你不应该关注这里的性能.

  • 我基本同意,但是`O(1)`没有说明一个操作所需的绝对时间.它只是说明了执行时间如何随着项目数量的变化而发展.总是需要10秒的操作是"O(1)",但仍然是一个非常真实的性能问题.所以,"O(1)=快"并不总是一个合理的结论.话虽如此,优化任意事物而不首先附加分析器是不成熟的优化和坏主意. (16认同)
  • 抱歉,不幸的是,这不回答这个问题.可能我对我的要求不够清楚. (4认同)

jav*_*nja 6

ConcurrentDictionary有一个TryRemove做这个方法。它的工作原理就像TryGet但它也删除了元素。


Mat*_*son 5

Copenehagen的泛型集合大学图书馆Dictionary.Remove(),似乎做你想做的方法:

bool删除(K k,out V v)

如果字典包含其键等于k的条目,则返回true,如果是,则删除该条目并将关联的值分配给v; 否则返回false并将T的默认值分配给v.

我自己没有使用过这个库,但是我已经在Stack Overflow上看到它推荐了几次.根据MIT风格的许可证,它可以免费使用.

  • 你做了什么样的搜索来找到它?谢谢 :) (2认同)
  • 很久以前我有一个旧书签,我终于记起来了.:) (2认同)