Какой самый эффективный класс коллекции в C # для поиска строк - PullRequest
6 голосов
/ 01 мая 2011
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 ]

4 голосов
/ 01 мая 2011

Я бы сам создал Dictionary<char, List<string>>, где я бы группировал слова по их первой букве. Это существенно сократит поиск нужного слова.

1 голос
/ 01 мая 2011

Если вам нужно выполнить поиск один раз, нет ничего лучше, чем линейный поиск - массив идеально подходит для этого.

Если вам нужно выполнить повторный поиск, вы можете рассмотреть сохранение массива (n Log n), и поиск по любому префиксу будет быстрым (long n). В зависимости от типа поиска, использование словаря списков строк, индексированных по префиксу, может быть другим хорошим вариантом.

0 голосов
/ 01 мая 2011

Если вы выполняете поиск гораздо чаще, чем изменяете файл словами.Вы можете сортировать слова в файле каждый раз, когда вы меняете список.После этого вы можете использовать двунаправленный поиск.Таким образом, вам нужно будет сделать до 20 сравнений, чтобы найти любое слово, совпадающее с вашим ключом, и некоторые дополнительные сравнения окрестностей.

...