我正在做一个性能关键程序(很少学术),我希望尽可能优化(不像它证明“这是”瓶颈)。
我有一个自定义字典结构(.NET Dictionary<,>
的包装器),我会不断在一个阶段删除项目(Key
值)。我需要删除项目的Value
。现在我必须这样做:
T t;
if !TryGet(key, out t)
return false;
Remove(key);
这是两次查找。我很想要这个:
public bool Remove(S key, out T value)
{
// implementation
}
我知道框架中没有任何内容,但是某处有实现吗?如果是这样的话,我会用那个更改我的支持词典。
编辑:嗯,我知道TryGetValue
和Remove
都是O(1)。只知道是否有任何集合结构只能在一次查找中产生相同的效果。正如我所说,我正在努力尽可能地优化。只是知道。
答案 0 :(得分:7)
Dictionary<TKey, TValue>.TryGetValue
和Dictionary<TKey, TValue>.Remove
方法都是 O(1)操作,因此我认为您不应该关注此处的效果。
答案 1 :(得分:5)
University of Copenehagen's Generic Collection Library有一个Dictionary.Remove()
方法似乎可以执行您想要的操作:
bool删除(K k,out V v)
如果字典包含键等于k的条目,则返回true 如果是,则删除该条目并将相关值分配给v; 否则返回false并将T的默认值分配给v。
我自己没有使用过这个库,但是我已经在Stack Overflow上看过它了几次。它可以免费使用,但需this MIT-style license。
答案 2 :(得分:4)
ConcurrentDictionary 有TryRemove
方法执行此操作。它就像TryGet
一样工作,但它也删除了元素。