我有一个被分成整数数组的字符串。此数组的大小可以是1项,最多100,000(或更大)。订单并不重要。
目标是稍后使用该对象来确定该值是否存在。一个单独的循环将测试该对象以查看该项是否存在(循环将迭代的次数超过testmeInt
数组中的项数)。
方式1:数组
尝试选择整数,发现错误
方式2:字典
var testme = "12,23".Split(',');
int[] testmeInt = Array.ConvertAll<string, int>(testme, int.Parse);
Dictionary<int, int> TestMeDict = new Dictionary<int, int>();
foreach (int item in testmeInt)
{
TestMeDict.Add(item, 0);
}
for (int i = 1; i <= 50000000; i++)
{
if (TestMeDict.ContainsKey(i) == true) {
//It Exists
}
}
我的猜测是使用Dictionary的Way2将是最快的。这question与我的相似,但不包括我的确切用例。
答案 0 :(得分:1)
假设值是唯一的,那么由于哈希查找,词典通常是检查集合中存在的项目的最快方法。
整个存储的项目(值)上不需要直接相等检查,只需要键,并且通过引擎盖下的字典将其作为哈希处理。
正如Jon Skeet所提到的,如果您只是存储整数并且不需要直接基于密钥的查找,那么HashSet是一种更好的方法。
答案 1 :(得分:1)
感谢大家的提示。研究HashSet我发现下面的帖子直接回答了我的问题。
根据我的要求,技术上HashSet就是答案。但是,下面博客中的性能测试表明,我的Way 2 Dictionary.Key方法具有与Hashset(0 ms)相同的性能。
http://theburningmonk.com/2011/03/hashset-vs-list-vs-dictionary/
HashSet<T> versus Dictionary<K, V> w.r.t searching time to find if an item exists