C # Проверьте, содержит ли строка какие-либо совпадения в массиве строк - PullRequest
11 голосов
/ 16 ноября 2010

Какой самый быстрый способ проверить, содержит ли строка какие-либо совпадения в массиве строк в C #?Я могу сделать это с помощью цикла, но я думаю, что это будет слишком медленно.

Ответы [ 5 ]

21 голосов
/ 16 ноября 2010

Использование LINQ:

 return array.Any(s => s.Equals(myString))

Конечно, вы можете принять во внимание культуру и случай, но это общая идея. Кроме того, если равенство - это не то, что вы подразумевали под «совпадениями», вы всегда можете использовать функцию, которую нужно использовать для «совпадения».

12 голосов
/ 27 мая 2013

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

Это проверит, содержит ли строка какую-либо из строк из массива:

string[] myStrings = { "a", "b", "c" };
string checkThis = "abc";

if (myStrings.Any(checkThis.Contains))
{
    MessageBox.Show("checkThis contains a string from string array myStrings.");
}

Чтобы проверить, содержит ли строка все строки (элементы) массива, просто измените myStrings.Any в операторе if на myStrings.All.

Я не знаю, что это за приложение, но мне часто приходится использовать:

if (myStrings.Any(checkThis.ToLowerInvariant().Contains))

Так что, если вы проверяете, чтобы увидеть ввод пользователя, не имеет значения, введет ли пользователь строку ЗАГЛАВНЫМИ буквами, это можно легко изменить, используя ToLowerInvariant ().

Надеюсь, это помогло!

6 голосов
/ 25 февраля 2015

Это прекрасно работает для меня:

string[] characters = new string[] { ".", ",", "'" };
bool contains = characters.Any(c => word.Contains(c));
4 голосов
/ 16 ноября 2010

Вы можете объединить строки с регулярным выражением или операторами, а затем «сделать это за один проход», но технически регулярное выражение все равно будет выполнять цикл внутри себя.В конечном счете, цикл необходим.

1 голос
/ 16 ноября 2010

Если «массив» никогда не изменится (или изменится очень редко), и у вас будет много входных строк, которые вы тестируете по нему, тогда вы можете построить HashSet<string> из массива. HashSet<T>.Contains является операцией O (1), в отличие от цикла, который является O (N).

Но для создания HashSet потребуется некоторое (небольшое) время. Если массив будет часто меняться, то цикл является единственным реалистичным способом сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...