【问题标题】:Is there any implementation to Remove by Key and get the Value at the same time? [duplicate]是否有任何实现键删除并同时获取值? [复制]
【发布时间】:2013-03-24 23:39:32
【问题描述】:

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

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

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

Remove(key);

这是两个查找。我会喜欢这个:

public bool Remove(S key, out T value)
{
    // implementation
}

我知道框架中什么都没有,但是在某个地方有实现吗?如果是这样,我会用那个来改变我的支持字典。

编辑: 嗯,我知道 TryGetValueRemove 都是 O(1)。只知道是否有任何集合结构可以在一次查找中产生相同的效果。正如我所说,我正在尝试尽可能优化。只是知道。

【问题讨论】:

  • 嗯,Dictionary 中的GetRemove 都具有O(1) 的摊销复杂性,所以调用Get + Remove 仍然会给你O(1).. .
  • 看来我得自己写一篇了..
  • 看起来那样,没有内置的东西可以返回从字典中删除的项目。
  • @nawfal 请在您自己的Dictionary&lt;,&gt; 实现之前对您的应用程序运行分析器(或进行自己的 分析)以识别真正的 瓶颈. (或者,您可以获取Mono Dictionary<,> implementation from its source code repository...
  • @ChrisSinclair 不用担心,如果我自己编写,我会先获取原始源代码并在此基础上进行构建。当然,我也会有时间(这始终是我的首要考虑)

标签: c# .net dictionary asymptotic-complexity trygetvalue


【解决方案1】:

ConcurrentDictionary 有一个TryRemove 方法可以做到这一点。它的工作方式与TryGet 类似,但它也会删除元素。

【讨论】:

    【解决方案2】:

    University of Copenehagen's Generic Collection Library 有一个 Dictionary.Remove() 方法似乎可以满足您的需求:

    bool Remove(K k, out V v)

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

    我自己没有使用过这个库,但我在 Stack Overflow 上看到过多次推荐它。可免费商用,以this MIT-style license为准。

    【讨论】:

    • 你做了什么样的搜索来找到它?谢谢:)
    • 我有一个很久以前的旧书签,我终于想起了。 :)
    • 我只是查看了源代码,他们完全按照我的意愿行事。我的意思是单次查找
    【解决方案3】:

    Dictionary&lt;TKey, TValue&gt;.TryGetValueDictionary&lt;TKey, TValue&gt;.Remove 方法都是 O(1) 操作,所以我认为您不必担心这里的性能。

    【讨论】:

    • 很抱歉,这并不能回答问题。可能是我对我的要求不够清楚。
    • 我基本上同意,但O(1) 没有说明操作所需的绝对时间。它只是说明了执行时间如何随着项目数量的变化而变化。一个总是需要 10 秒的操作是O(1),但仍然可能是一个非常现实的性能问题。因此,“O(1) = fast”并不总是一个合法的结论。话虽如此,在不首先附加分析器的情况下优化任意事物是过早的优化和一个坏主意。
    • @DanielHilgarth 没错,我就是这么想的(尽管 .NET Dictionary 速度非常快)。
    • 所以你必须自己写一些东西(但我不知道如何在Dictionary 上完成,真的)。 Dictionary 这么快,因为它使用散列来查找集合中的项目。 O(1) 操作就是这样做的 - 计算 HashCode 并检查它是否已经设置。
    • @MarcinJuraszek 是的,但除此之外,在删除之前,我可以out Value 回来。如果我必须自己滚动一个,我的意思是在自定义词典中。我不接受标准字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2015-12-16
    • 2019-09-26
    • 2015-03-23
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多