12

我正在做一个性能关键的程序(很少的学术内容),并且我希望尽可能地进行优化(不像它证明“这是”瓶颈)。

我有一个自定义字典结构(围绕 .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)。只知道是否有任何集合结构可以在一次查找中产生相同的效果。正如我所说,我正在尝试尽可能优化。只是知道。

4

3 回答 3

8

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

于 2013-04-03T10:40:47.053 回答
6

哥本哈根大学的通用收藏图书馆有一种Dictionary.Remove()方法似乎可以满足您的要求:

bool Remove(K k, out V v)

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

我自己没有使用过这个库,但我已经在 Stack Overflow 上看到过多次推荐它。它可以在商业上免费使用,但须遵守这种 MIT 风格的许可证

于 2013-04-03T11:56:25.900 回答
6

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

于 2015-09-04T20:17:44.943 回答