2013-04-03 5 views
1

Я понял, что при использовании Regex я могу ввести значение | для поиска многих значений. Например:Как сделать, если короче?

Regex sabrina = new Regex("Rihanna|rihanna|Sabrina|sabrina"); 

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

if (rihanna == "Rihanna" || rihanna == "sabrina") 

Мой вопрос, если это возможно сделать if короче? Я знаю, что этот код не работает, но то, что я искал что-то вроде этого:

if (rihanna == "Rihanna|sabrina") 
+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+3

Почему здесь короче? – JaredPar

+3

'Regex sabrina =' Я знал это! Регулярные выражения - женщины! Должно быть, поэтому многие люди не понимают их. – dialer

ответ

1

Если вы ищете более легкую поддержание потенциально длинного списка кандидатов в строку, почему бы не использовать оператор switch? Технически это будет «длиннее» по характеру, но если вам нужно модифицировать вещи по дороге или обеспечить некоторую тонкую вторичную обработку, это может сделать многое намного проще.

2

Вы можете использовать List<string> наряду с методом Enumerable.Contains.

Пример:

var values = new List<string> { "Rihanna", "rihanna", "Sabrina", "sabrina" }; 

if (values.Contains(rihanna)) 
{ 
    // etc. 
} 

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

Даже лучшим решением было бы использовать Enumerable.Any и String.Equals выполнить сравнение без учета регистра:

if (values.Any(x => String.Equals(rihanna, x, StringComparison.OrdinalIgnoreCase)) 
{ 
    // your code here 
} 

Хотя if заявление теперь уже решение является гораздо более надежным.

+0

В конце концов, ему придется создать «Список », поэтому он будет на самом деле длиннее –

+0

@caerolus - код может быть длиннее, но ** если ** будет короче. – Yakimych

+0

Ответ на этот вопрос, но я не вижу преимущества в попытке сделать его короче за счет большего количества кода в другом месте. Зачем вам его сокращать? –

5

решение одной линии:

if("Rihanna|rihanna|Sabrina|sabrina".Split(new[] {'|'}).Contains(rihanna)) 

или без использования String.Split метода:

if ((new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" }).Contains(rihanna)) 

Если такая проверка выполняется более чем один раз, вы должны сохранить string[] массив возможных значений в переменную:

var names = new[] { "Rihanna", "rihanna", "Sabrina", "sabrina" }; 

if(names.Contains(rihanna)) 
+0

Я думаю, что последний вариант выглядит как лучший вариант в долгосрочной перспективе. Простота обслуживания, если требуется больше параметров, вы можете даже передать существующую коллекцию, если ищете дополнительную динамическую обработку. –

0

Вы можете использовать свой собственный Regex и использовать его в качестве одной линии ..

if (Regex.Match(rihanna, "Rihanna|rihanna|Sabrina|sabrina").Success) 

Или сделать это случай-insensative как это ..

if (Regex.Match(rihanna, "rihanna|sabrina", RegexOptions.IgnoreCase).Success){ 
+0

Чтобы игнорировать случай только первой буквы, можно также использовать '[Rr] ihanna | [Ss] abrina' – david

0

Игнорирование корпус, который выглядит как-то вы собираетесь за, и использовать String.Compare:

if(String.Compare(rihanna, "sabrina", StringComparison.OrdinalIgnoreCase) == 0 || 
    String.Compare(rihanna, "rihana", StringComparison.OrdinalIgnoreCase) == 0) { 
    // do stuff 
} 
1

В качестве альтернативы выше ответов, возможно, вы могли бы рассмотреть возможность использования метода расширения:

public static bool EqualsAny(this string input, params string[] values) 
{ 
    return values.Any(v => String.Equals(input, v, StringComparison.OrdinalIgnoreCase)); 
} 

с использованием как:

if (rihanna.EqualsAny("Rihanna", "Sabrina")) 

Это должно дать довольно читаемые/компактные/короткие if сравнения для вас, особенно в сравнении с некоторыми другими альтернативами здесь.

Проверьте, есть ли у вас OrdinalIgnoreCase или нет или вы можете добавить любые перегрузки. Мог бы даже реализовать весь трубопровод/расщепление, где вы проходите в «Rihanna Sabrina».

EDIT: Возможно, более критично, он централизует , как вы сравниваете, а не дублируете код везде.

0

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

var listToCheck = new Dictionary<string, string>( 
    StringComparer.CurrentCultureIgnoreCase) { { "rihanna", null}}; 

if (listToCheck.ContainsKey("Rihanna")) .... 
Смежные вопросы