【问题标题】:Is Dictionary the best way to record presence or absence of a key字典是记录键是否存在的最佳方式吗
【发布时间】:2012-03-10 22:34:30
【问题描述】:

抱歉,如果其他地方已经问过这个问题,但我找不到。

我想在 .NET 中存储一组字符串,以便可以轻松快速地查找密钥是否已存储。

我可以只使用 List 并在每次需要搜索时枚举列表,但显然线性搜索效率很低。

所以我的下一个想法是使用 Dictionary 并每次都查询它,这有望带来一些很酷的字符串散列和更快的搜索时间。但是,我实际上并没有在字典的“对象”部分中存储任何内容,因此看起来可能效率低下。

有没有更好的方法来做到这一点?

【问题讨论】:

  • List 有一个 Contains 方法,因此您无需枚举它即可找到匹配项
  • @KAJ 猜猜Contains 在内部做什么。 ;-)
  • @KAJ - 看起来最好的答案是使用 HashSet,但只是想知道 - List.Contains 方法会在 O(1) 中执行,还是只是在幕后进行线性搜索像我的版本一样? (我想是后者,因为 List 适用于任何类型,而不仅仅是那些可以排序和散列的类型)
  • @KonradRudolph:它会在您等待披萨完成时为您订购披萨吗?那么它应该!我的理念是,当您可以让等待更“合意”时,为什么还要让程序更快、更高效!
  • Contains 是一个 O(n),其中 n 是计数操作。 msdn.microsoft.com/en-us/library/bhkz42b3.aspx。 @Konrad Rudolph 是的,我知道,但我更要指出的是,在这种情况下手动实现枚举是没有意义的 ;-)

标签: c# dictionary key


【解决方案1】:

您正在寻找 HashSet<string>,它提供与字典相同的 O(1) 性能,但没有那些讨厌的值。

【讨论】:

    【解决方案2】:

    HashSet<string> 用于无序集或
    SortedSet<string> 如果顺序很重要。

    【讨论】:

      【解决方案3】:

      如果您的字典对象被多个线程使用,ConcurrentDictionary(Of TKey, TValue) 是更好的选择。

      【讨论】:

        猜你喜欢
        • 2015-10-30
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 2015-02-15
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2013-08-09
        相关资源
        最近更新 更多