【问题标题】:Dictionary TryGetValue without using value returned字典 TryGetValue 不使用返回的值
【发布时间】:2013-07-16 13:33:59
【问题描述】:

我正在实现一个简单的Dictionary<String, Int>,它跟踪我下载的图片文件,以及文件的重命名。

String - 原始文件名

Int - 新文件名

我阅读了 TryGetValueContainsKey 并发现了这个:

TryGetValue 方法比ContainsKey 方法更快,但仅当 您想检查集合中的键并且还想获取值 与之相关联。如果您只想检查密钥是否存在或 不要只使用ContainsKey

来自here

因此,我想知道其他人对以下内容的看法:

我是否应该使用TryGetValue,即使我不打算使用返回的value,假设字典大小会增长到1000 个条目,并且我每次下载时都会进行重复检查,即。经常吗?

【问题讨论】:

  • 引用说d.TryGetValue(key, out value)value = d.ContainsKey(key) ? d[key] : null 快,并不是说它总是比 ContainsKey 快。

标签: c# .net performance dictionary


【解决方案1】:

理论上,请遵循文档。如果您不想要该值,请使用ContainsKey,因为没有代码可以去实际从内存中获取值。

现在,在实践中,这可能无关紧要,因为您正在对 Dictionary 进行微优化,这在总体方案中可能非常小。因此,在实践中,做最适合您和代码可读性的事情。

为了帮助您获得一个好主意,would grow to 1000 entries非常小,因此在实践中真的不重要。

【讨论】:

  • 漂亮的开合箱
【解决方案2】:

如果您只想检查密钥是否存在或不只使用 ContainsKey。

我想你自己回答了这个问题。

【讨论】:

    【解决方案3】:

    看看Reflector下两者的实现

    public bool TryGetValue(TKey key, out TValue value)
    {
        int index = this.FindEntry(key);
        if (index >= 0)
        {
            value = this.entries[index].value;
            return true;
        }
        value = default(TValue);
        return false;
    }
    
    public bool ContainsKey(TKey key)
    {
        return (this.FindEntry(key) >= 0);
    }
    

    这两种方法都是这样实现的。

    现在您可以自己决定哪种方法最好。

    【讨论】:

      【解决方案4】:

      我认为性能提升(如果有的话)不值得用这种优化来混淆你的代码。

      在您的定位规模与代码可维护性之间取得平衡。例如:

      ~10K 平均并发调用 vs. 50 个开发人员团队规模不要这样做!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        相关资源
        最近更新 更多