C# 保持访问速度的Pass Dictionary KeyCollection

C# 保持访问速度的Pass Dictionary KeyCollection,c#,.net,list,dictionary,.net-2.0,C#,.net,List,Dictionary,.net 2.0,我有一个只使用字典的keyCollection的类,我只想将键传递给其他类 我知道字典有一个理论上的O(1)索引访问(作为HashTable),但是如果我将keyCollection转换为一个列表,访问将更改为O(n) 如何将keyCollection传递给维护O(1)访问权限的类 编辑:我正在使用.NET 2.0 提前感谢。在评论中,您提到您的意图是.Contains()。在这种情况下,您要查找的是HashSet,它正是这样做的-它只保存键(没有值),并提供快速的包含检查。所以对于您的词典,您

我有一个只使用
字典
的keyCollection的类,我只想将键传递给其他类

我知道字典有一个理论上的
O(1)
索引访问(作为
HashTable
),但是如果我将keyCollection转换为一个列表,访问将更改为
O(n)

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

编辑:我正在使用.NET 2.0


提前感谢。

在评论中,您提到您的意图是
.Contains()
。在这种情况下,您要查找的是
HashSet
,它正是这样做的-它只保存键(没有值),并提供快速的
包含检查。所以对于您的
词典
,您可以执行以下操作:

var set = new HashSet<long>(dictionary.Keys);
然后把它传过去;
的实现包含(键)
这是O(1),因为它是通过以下方式实现的:

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

定义“访问”。。。如果您的意思是“按索引读取”,那么访问仍然是O(1),并且确实必须比哈希表快O(1)。实际上,O(1)只适用于按键访问值,这在键列表中没有任何意义-您想对列表做什么?@marcGravel:是的,我的意思是按索引访问(.Contains())@marcGravel:我只需要键集合来知道字典是否包含某些键值,所以我只需要键。相关:和,假设您可以控制该类,它应该真正接受
ISet
,而不是
HashSet
。(为了避免将键从字典复制到一个集合,您可以创建一个包装类,该类使用字典并实现
ISet
方法。)谢谢,这正是我要问的。谢谢。@Porges
ISet
并没有为这种情况提供很多有用的方法,事实上-正是
ICollection
(ISet
要求的)才是有用的。这是真的。。。那就用我说的话代替我的收集吧@MarcGravel:啊,这是.NET4.0上的新版本。我正在使用.NET2.0。KeyCollection的Contains()性能如何?
bool ICollection<TKey>.Contains(TKey item)
{
    return this.dictionary.ContainsKey(item);
}