我需要存储大量独特的路径,例如:"C:\MyDir\MySubDir\myfile.txt"
。
我希望能够快速检查我的集合中是否包含路径,以及尽可能少使用内存。
此任务最合适的collection是什么?
是否可以存储代表唯一路径的值而不是字符串本身来使用更少的内存?
答案 0 :(得分:3)
看看Trie我们用20百万条路径做了非常有效的
答案 1 :(得分:2)
哈希集,如果您需要快速访问数据,即如果您想在O(1)时间内知道集合中是否存在某些内容。
在.NET 4中,使用HashSet
。它就像一个哈希表,但只存储了值,而不是键/值对。
HashSet<string> myStrings = new HashSet<string>();
myStrings.Add(@"c:\foo\bar.txt");
myStrings.Add(@"c:\foo\baz.gif");
myStrings.Add(@"c:\foo\bat.bin");
答案 2 :(得分:2)
这最适合TRIE。以下是一个示例:implementing a trie in c#。
要回答您的问题,是,TRIE会存储唯一路径而不是字符串本身。
在内存消耗和执行速度方面,尝试对您的任务非常有效。
修改强> 并不是一个人比另一个好, TRIE是为这种类型的存储/检索问题而发明的并且非常有效。 哈希也很快。如果您想知道哪一个最适合您的需求,请同时实施。它不应该花很长时间。 衡量,衡量,衡量。
答案 3 :(得分:2)
正如其他人所回答的那样,Trie
和HashSet
会提供快速提取时间
需要注意的是,虽然Trie
需要的费用少于HashSet
,但两者都需要比普通的List
更多的内存(请参阅this )。
我不知道它是否真的是necessary,但如果内存是一个真正的问题,你可以优化Trie
实现,使用文件夹名称作为节点而不是字母(通常是文件夹)名字长于一个字母)。这样您就可以使用路径的树结构。
答案 4 :(得分:0)
为什么不将Dictionary / HashTable用于为您提供快速查找集合的目的。
“可以存储一个可以显示唯一路径的值。” - 想想这一点,每当你必须检查集合中存在的某些值时,你必须对你的字符串进行encript / decrypt。不好的方法
编辑: 如果速度不是问题,为什么不将所有密钥存储在数据库中,然后你可以在表中快速循环以查看路径是否存在?
答案 5 :(得分:0)
通常用于存储唯一数据点的数据结构是一组。您可以使用.NET HashSet<T>
类。使用HashSet,您不必在添加之前检查是否存在值,并且您也可以快速查找。