c#.net Compact Framework 3.5中最快的字典查找

c#.net Compact Framework 3.5中最快的字典查找,c#,.net,dictionary,compact-framework,lookup,C#,.net,Dictionary,Compact Framework,Lookup,我正在寻找查找列表、集合、字典是否包含特定关键字(字符串)的最快方法。我不需要在里面存储任何数据,我只想知道我的关键字是否在列表中 我考虑了一些可能性,比如: Dictionary<string, bool> myDictionary = new Dictionary<string, bool>(); if (myDictionary.ContainsKey(valueToSearch)) { // do something } 然后我发现: List<s

我正在寻找查找列表、集合、字典是否包含特定关键字(字符串)的最快方法。我不需要在里面存储任何数据,我只想知道我的关键字是否在列表中

我考虑了一些可能性,比如:

Dictionary<string, bool> myDictionary = new Dictionary<string, bool>();
if (myDictionary.ContainsKey(valueToSearch))
{
    // do something
}
然后我发现:

List<string> list = new List<string>();
if (list.Contains(valueToSearch))    
{
    // do something
}
List List=新列表();
if(列表包含(valueToSearch))
{
//做点什么
}
查找将经常发生,并且必须非常快。
你知道什么是检查一个值是否等于给定键列表中的一个键的最快方法吗?

在标准集合类型中,
字典将是最快的,因为我认为紧凑框架中没有
哈希集。另外两个进行顺序搜索

一般来说,字典查找是解决此类问题的常用方法,只要您的键是良好的散列值,并且在字典的查找表中得到了某种程度上均匀的分布

但是,在某些情况下,列表查找可能会运行得更快,具体取决于数据的排序方式以及您要查找的内容


最好的方法是对每个案例进行分析,看看哪一个表现更好。

我同意安迪的观点。你也可以看看SortedList,它本质上是一本按键排序的字典。如果已经排序,应该可以加快搜索速度…

为什么不自己获取一份RedGate Profiler的副本并运行一些测试?它将为您提供一个很好的指示,说明什么将更快地进行查找。有些事情会影响性能,例如项目的顺序、使用的算法以及列表的大小。我本来打算这么做的,但我的试验结果表明,哪种数据结构最快通常与问题的大小、数据的冗余、查询的分布以及“垃圾”(即不匹配)查询的可能性密切相关。我们在快速查找编译器局部变量表时遇到的问题与快速查找拼字词典时遇到的问题完全不同。局部变量表很小,查询倾向于集群;拼字词典很大,查询很少重复。你能更详细地描述这个问题的特征吗?我不确定我是否正确地解释了MSDN,但它看起来像是压缩框架中包含了哈希集@贾斯汀:哈希集在CF中不可用。@ctacke-啊,我现在明白了——我在MSDN上读到了“客户端配置文件”,认为是“紧凑框架”。@Justin-是的,MSDN很少被我称为CF支持的“清除”。对项目进行排序不会提高查找速度,因为
SortedDictionary
仍然使用哈希表进行查找。哈希表查找是一种O(1)操作。在排序列表中搜索通常是一个O(logn)操作。如果哈希表有过多的冲突(这意味着哈希函数不足或表几乎已满),则搜索将优于哈希查找的唯一时间。
List<string> list = new List<string>();
if (list.Contains(valueToSearch))    
{
    // do something
}