Как проверить, массив строк содержит конкретную строку? - PullRequest
2 голосов
/ 05 августа 2009

Я использую .NET 2.0 У меня есть большой массив строк. Я хочу проверить, есть ли конкретная строка в массиве или нет, Я не уверен, оптимизирован ли следующий код или мне нужно сделать его более оптимизированным. пожалуйста, руководство.

string []test_arr= new string[]{"key1","key2","key3"};
Boolean testCondition = (new List<string>(test_arr)).Contains("key3");

Я также хочу узнать больше о

  1. .NET Generics
  2. .NET-атрибуты
  3. .NET Reflections

есть какая-нибудь хорошая справка или книга, которую кто-то уже упоминал, помогите мне!

Ответы [ 7 ]

8 голосов
/ 05 августа 2009
string []test_arr= new string[]{"key1","key2","key3"};
bool testCondition = Array.Exists
(
    test_arr,
    delegate(string s) { return s == "key3";}
);
2 голосов
/ 05 августа 2009

Если это возможно, вы можете отсортировать массив (используя статический метод Array.Sort ), а затем использовать Array.BinarySearch

В качестве альтернативы вам нужно использовать более оптимизированную структуру данных для ваших строк.

1 голос
/ 05 августа 2009

Мой ответ очень похож на Мэтта Хауэллса. Но я предлагаю использовать StringComparison


Array.Exists<string>(stringsArray,
                delegate(string match)
                {
                    return match.Equals("key", StringComparison.InvariantCultureIgnoreCase)
                });
1 голос
/ 05 августа 2009

о вашем массиве строк larga: нет оптимизированного способа, пока вы используете массив (вы должны начинать с первого элемента и проходить через каждый, пока не найдете его - или пройти весь массив, если вы этого не сделали) - это дает вам худшее время O (n) (обозначение O дает время, необходимое программе для достижения чего-либо).

Поскольку вы хотите оптимизировать поиск, я предлагаю вместо этого использовать хеш-таблицу или дерево (в зависимости от размера вашего набора данных). Это значительно сократит время проверки

1 голос
/ 05 августа 2009

В вашем примере, вероятно, самыми большими издержками будет создание списка, но это может быть частью демонстрации.

Начиная с массива, следующее, вероятно, будет быстрее:

int x = Array.IndexOf<string>(test_arr, "key3");
bool testCondition = x >= 0;

Но если у вас есть возможность, было бы эффективнее использовать HashSet<string> для хранения их в первую очередь. HashSet может проверить наличие элемента в O (1).

Что касается других ваших вопросов, они уже задавались на SO, используйте опцию поиска, например, с "C # books"

1 голос
/ 05 августа 2009

Список - O (n), SortedList - O (log n)

1 голос
/ 05 августа 2009

В .NET Framework версии 2.0 класс Array реализует системные интерфейсы System.Collections.Generic.IList, System.Collections.Generic.ICollection и System.Collections.Generic.IEnumerable.

Следовательно, вы можете сделать следующее:

string[] test_arr = new string[]{"key1","key2","key3"};
Boolean testCondition = ((IList<string>)test_arr).Contains("key3");
...