Самый быстрый способ сравнить строку с массивом строк в C # 2.0

17

Каков самый быстрый способ сравнить строку с массивом строк в C # 2.0

    
задан Greens 26.06.2009 в 23:02
источник

3 ответа

7

Вы хотите увидеть, находится ли строка в массиве? Я не могу вспомнить, поддерживают ли массивы метод .Contains (), поэтому если нет, создайте List & lt; string & gt ;, добавьте свой массив в список через AddRange (), затем вызовите list.Contains ({строка для сравнения}). Возвращает логическое значение, указывающее, находится ли строка в массиве.

    
ответ дан James McConnell 26.06.2009 в 23:06
источник
  • Правильно, в 2.0 вам нужно будет сделать (новый List <String> (массив)). Содержит (targetString); - но из 3.5 у вас есть метод расширения IEnumerable <String> .Contains, поэтому он также доступен для массивов. –  Groo 26.06.2009 в 23:17
  • В 2.0 вы можете проверить, содержит ли массив определенное значение или нет с простым Array.IndexOf (arr, val)> = 0. –  Mehrdad Afshari 26.06.2009 в 23:35
32

Какое сравнение вы хотите? Вы хотите узнать, находится ли данная строка в массиве?

bool targetStringInArray = array.Contains(targetString);

Вы хотите массив значений сравнения (положительный, отрицательный, нулевой)?

var comparisons = array.Select(x => targetString.CompareTo(x));

Если вы проверяете сдерживание (т. е. первый вариант), и вы собираетесь делать это с помощью нескольких строк, вероятно, было бы лучше построить HashSet<string> из массива:

var stringSet = new HashSet<string>(array);

if (stringSet.Contains(firstString))  ...
if (stringSet.Contains(secondString)) ...
if (stringSet.Contains(thirdString))  ...
if (stringSet.Contains(fourthString)) ...
    
ответ дан Jon Skeet 26.06.2009 в 23:06
источник
5

Если вы делаете это много раз с помощью одного массива, вы должны отсортировать массив и бинарный поиск по нему:

Array.Sort(array);
int index = Array.BinarySearch(array, input);
// if (index < 0) 
//      does not exists, "items > ~index" are larger and "< ~index" are smaller
// otherwise, "items > index" are larger and "< index" are smaller.

В противном случае просто наименее проверить массив:

bool exists = Array.IndexOf(array, input) >= 0;
    
ответ дан Mehrdad Afshari 26.06.2009 в 23:06
источник
  • Если вы собираетесь делать это много раз, есть более эффективные поиски, чем двоичный поиск (при условии, что он достаточно большой, во всяком случае). Я бы пошел на что-то основанное на хэше, например. HashSet. –  Jon Skeet 26.06.2009 в 23:08
  • Да. Хеш-таблица / дробное деление дерева поиска ... Оба лучше, чем поиск всего массива, тем не менее. HashSet доступен только в 3.5. –  Mehrdad Afshari 26.06.2009 в 23:39