Есть ли способ оценить более одной строки внутри метода string.contains ()? - PullRequest
1 голос
/ 25 октября 2011
if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE"))

Приведенный выше код - это то, что у меня есть, и мне было интересно, если бы у меня был более длинный список строк для того же условия, как бы я это сделал, не делая код слишком длинным.Может быть, лямбда-выражение?

Ответы [ 6 ]

7 голосов
/ 25 октября 2011

Нет, встроенной функции нет. Но это не сложно написать самому:

string[] needles = new string[]{"BOUGHT", "PURCHASE"};
string haystack = description.ToUpperInvariant();
bool found = needles.Any(needle=> haystack.Contains(needle));

Я конвертирую hackstack в верхний только один раз для улучшения производительности.

В качестве альтернативы вы можете использовать IndexOf(needle, StringComparison.OrdinalIgnoreCase)>=0:

string[] needles = new string[]{"BOUGHT", "PURCHASE"};
string haystack = description;
bool found = needles.Any(needle=> haystack.IndexOf(needle, StringComparison.OrdinalIgnoreCase)>=0);

Вы не должны использовать ToUpper() здесь, так как это использует текущую культуру. Использование текущей культуры может привести к непредвиденным проблемам на некоторых компьютерах, например, i не использует заглавные буквы до I при использовании турецкой культуры.

Могут остаться некоторые тонкие проблемы, когда ToUpperInvariant() с обеих сторон, и сравнение без учета регистра может дать разные результаты, но это актуально, только если в вашем стоге сена и иголках есть необычные символы.

2 голосов
/ 25 октября 2011

Вы можете переделать код в нечто вроде этого:

var words = new[] { "BOUGHT", "PURCHASE" };
var desc = description.ToUpper();
if(words.Any(w => description.Contains(w)) {
    // something matched
}
1 голос
/ 25 октября 2011

Используйте регулярное выражение:

  if (Regex.IsMatch(description, "purchase|bought", RegexOptions.IgnoreCase)) {
     // ...
  }
1 голос
/ 25 октября 2011
Regex.IsMatch(input, string.Join("|", strings));

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

1 голос
/ 25 октября 2011
if (someCollectionOfStrings.Any(string => originalString.Contains(string))
{
    //stuff
}
0 голосов
/ 25 октября 2011
public static bool ContainsOneOfManyIgnoreCase(this string str, params string [] items)
    {
      return items.Any(x => str.IndexOf(x, StringComparison.CurrentCultureIgnoreCase) != -1);
    }
...