【问题标题】:Pass Dictionary KeyCollection mainaining the access speed通过 Dictionary KeyCollection 维护访问速度
【发布时间】:2012-02-07 16:34:45
【问题描述】:

我有一个只使用 Dictionary<long, object> 的 keyCollection 的类,我想只将键传递给其他类。

我知道字典有一个理论上的O(1) access-by-index(作为HashTable),但如果我将keyCollection 转换为List,则访问权限将更改为O(n)

如何将 keyCollection 传递给维护O(1) 访问权限的班级?

编辑:我使用的是 .NET 2.0。

提前致谢。

【问题讨论】:

  • 定义“访问”...如果您的意思是“按索引读取”,访问仍然是 O(1),而且确实比 O(1)一个哈希表。实际上,O(1) 仅适用于按键访问值,这在 键列表 中毫无意义 - 你想对列表做什么?
  • @MarcGravell:是的,我的意思是按索引访问 (.Contains())
  • @MarcGravell:我只需要密钥集合来知道字典是否包含某些键值,所以我只需要键。

标签: c# .net list dictionary .net-2.0


【解决方案1】:

在评论中,您提到您的意图是.Contains()。在这种情况下,您正在寻找的是HashSet<T>,它正是这样做的——它只保存键(没有值),并提供快速的Contains 检查。所以;对于您的Dictionary<long,object>,您可以执行以下操作:

var set = new HashSet<long>(dictionary.Keys);

并通过它。为方便起见,HashSet&lt;T&gt; 实现了 ICollection&lt;T&gt;(如果您想将其范围限定为接口,而不是具体类型) - 这也有一个 Contains

其实用起来可能效率更高(在.NET 2.0上也可以):

ICollection<long> = dictionary.Keys;

然后通过; Contains(key) 的实现是 O(1),因为它是通过以下方式实现的:

bool ICollection<TKey>.Contains(TKey item)
{
    return this.dictionary.ContainsKey(item);
}

【讨论】:

  • 而且,假设您可以控制该类,它应该真正接受ISet&lt;T&gt; 而不是HashSet&lt;T&gt;。 (为了避免将键从字典复制到集合中,您可以创建一个包装类,该类接受字典并实现 ISet&lt;T&gt; 方法。)
  • 谢谢,这正是我要问的。谢谢。
  • 这是真的……那么,只需将ICollection&lt;T&gt; 替换为我所说的即可。 ;)
  • @MarcGravell:Arrg,这是 .NET 4.0 上的新功能。我正在使用.NET 2.0。 KeyCollection 的 Contains() 性能如何?
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 2014-01-11
  • 2014-06-10
  • 1970-01-01
  • 2019-09-24
  • 2017-11-03
  • 2013-02-04
  • 2012-02-17
相关资源
最近更新 更多