C#中用于字符串搜索的最有效的集合类是什么

时间:2011-05-01 05:00:59

标签: c# data-structures collections linq-to-objects

string[] words = System.IO.File.ReadAllLines("word.txt");
var query = from word in words
            where word.Length > "abe".Length && word.StartsWith("abe")
            select word;
foreach (var w in query.AsParallel())
{
    Console.WriteLine(w);
}

word.txt基本上包含170000个英文单词。 C#中的集合类是否比上述查询的字符串数组更快?没有插入或删除,只需搜索字符串以“abe”或“abdi”开头。

文件中的每个单词都是唯一的。

EDIT 1此搜索将在我的应用程序中执行数百万次。另外,我想坚持使用LINQ进行集合查询,因为我可能需要使用聚合函数。

EDIT 2文件中的单词已经排序,文件不会更改

3 个答案:

答案 0 :(得分:4)

我自己创建一个Dictionary<char, List<string>>,在那里我按照第一个字母分组。这将大大减少所需单词的查找。

答案 1 :(得分:1)

如果你需要做一次没有什么比线性搜索更好的搜索 - 数组完全没问题。

如果您需要执行重复搜索,您可以考虑对阵列进行测试(n Log n),并且任何前缀搜索都会很快(长n)。根据使用前缀索引的字符串列表的搜索类型,可能是另一个不错的选择。

答案 2 :(得分:0)

如果搜索频率高于使用文字更改文件。每次更改列表时,您都可以对文件中的单词进行排序。在此之后,您可以使用二分搜索。因此,您必须进行最多20次比较才能找到与您的钥匙匹配的任何单词以及一些额外的邻居比较。