Подтвердить что ты не робот

Лучшая коллекция для быстрого поиска строк

Мне нужен список строк и способ быстро определить, содержится ли строка в этом списке.

Чтобы увеличить скорость поиска, я рассмотрел SortedList и Dictionary; однако, оба работают с KeyValuePair, когда мне нужно только одно string.

Я знаю, что могу использовать KeyValuePair и просто игнорировать часть Value. Но я предпочитаю быть эффективным, и мне просто интересно, есть ли коллекция, более подходящая для моих требований.

4b9b3361

Ответ 1

Если вы используете .NET 3.5 или выше, используйте HashSet<String>.

В противном случае a Dictionary<string, byte> (или любой другой тип, который вы хотите для параметра типа TValue) будет быстрее, чем SortedList, если у вас много записей - последний будет использовать двоичный поиск, поэтому он 'будет искать O (log n) вместо O (1).

Ответ 2

Если вы просто хотите знать, есть ли строка в наборе, используйте HashSet<string>

Ответ 3

Это звучит как задание для

 var keys = new HashSet<string>();

Per MSDN: функция Содержит имеет сложность O (1).

Но вы должны знать, что при добавлении он не дает ошибки для дубликатов.

Ответ 4

HashSet<string> как Dictionary, но только с ключами.

Ответ 5

Если вам хочется перевернуть свою собственную структуру данных, используйте Trie. http://en.wikipedia.org/wiki/Trie

В худшем случае, если строка присутствует: O (длина строки)

Ответ 6

Я знаю, что этот ответ немного опоздал на эту вечеринку, но у меня возникла проблема, когда наши системы работали медленно. После профилирования мы выяснили, что было много поисков строк, происходящих с тем, как мы структурировали наши структуры данных.

Итак, мы провели какое-то исследование, натолкнулись на эти тесты, сделали наши собственные тесты и теперь переключились на использование SortedList.

if (sortedlist.ContainsKey(thekey))
{   
//found it.
}

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

В любом случае, вы хотите поделиться сайтом, если другие люди сталкиваются с подобными проблемами. Они выполняют сравнения между структурами данных, где строка, которую вы ищете, является "ключом" (например, HashTable, Dictionary и т.д.) Или "значением" (List, Array, или в словаре и т.д.), Где наши сохраняются.

Ответ 7

Я знаю, что вопрос старый, как ад, но мне просто пришлось решить ту же проблему, только для очень небольшого набора строк (между 2 и 4).

В моем случае я фактически использовал ручной поиск по массиву строк, который оказался намного быстрее, чем HashSet<string> (я сравнивал его).

for (int i = 0; i < this.propertiesToIgnore.Length; i++)
{
    if (this.propertiesToIgnore[i].Equals(propertyName))
    {
        return true;
    }
}

Обратите внимание, что он лучше, чем хэш, только для крошечных массивов!

EDIT: работает только с ручным циклом for, не используйте LINQ, подробности в комментариях