有没有办法在string.contains()方法中评估多个字符串?

时间:2011-10-25 12:57:13

标签: c# string lambda case-insensitive string-comparison

if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE"))

上面的代码是我所拥有的,我想知道我是否有相同条件的更长字符串列表,如何在不使代码太长的情况下执行此操作。也许是一个lambda表达式?

6 个答案:

答案 0 :(得分:7)

不,没有内置功能。但是自己写它并不难:

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()和不区分大小写的比较可能会返回不同的结果时,可能仍然存在一些微妙的问题,但只有在大海捞针和针头都有不寻常的字符时才会有相关性。

答案 1 :(得分:2)

您可以将代码重写为以下内容:

var words = new[] { "BOUGHT", "PURCHASE" };
var desc = description.ToUpper();
if(words.Any(w => description.Contains(w)) {
    // something matched
}

答案 2 :(得分:1)

if (someCollectionOfStrings.Any(string => originalString.Contains(string))
{
    //stuff
}

答案 3 :(得分:1)

Regex.IsMatch(input, string.Join("|", strings));

如果字符串包含正则表达式控制字符,则可能必须转义它们。

答案 4 :(得分:1)

Use a regular expression:

  if (Regex.IsMatch(description, "purchase|bought", RegexOptions.IgnoreCase)) {
     // ...
  }

答案 5 :(得分:0)

public static bool ContainsOneOfManyIgnoreCase(this string str, params string [] items)
    {
      return items.Any(x => str.IndexOf(x, StringComparison.CurrentCultureIgnoreCase) != -1);
    }