Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种方法可以在string.contains()方法中计算多个字符串?_C#_String_Lambda_Case Insensitive_String Comparison - Fatal编程技术网

C# 是否有一种方法可以在string.contains()方法中计算多个字符串?

C# 是否有一种方法可以在string.contains()方法中计算多个字符串?,c#,string,lambda,case-insensitive,string-comparison,C#,String,Lambda,Case Insensitive,String Comparison,上面的代码就是我所拥有的,我想知道,对于相同的条件,我是否有一个更长的字符串列表,我将如何做到这一点而不使代码过长。可能是lambda表达式?不,没有内置函数。但自己写也不难: if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE")) 我只将hackstack转换为upper一次,以提高性能 或者,您可以使用IndexOfneedle、StringComparison.

上面的代码就是我所拥有的,我想知道,对于相同的条件,我是否有一个更长的字符串列表,我将如何做到这一点而不使代码过长。可能是lambda表达式?

不,没有内置函数。但自己写也不难:

if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE"))
我只将hackstack转换为upper一次,以提高性能

或者,您可以使用IndexOfneedle、StringComparison.OrdinalIgnoreCase>=0:

您不应该在这里使用ToUpper,因为它使用当前的区域性。使用当前区域性可能会在某些计算机上导致意外问题,例如,在使用土耳其区域性时,i不大写


可能仍然存在一些微妙的问题,在这两种情况下,Toupper不变量和不区分大小写的比较可能会返回不同的结果,但这仅在haystack和Piners中都有不寻常的字符时才相关。

不,没有内置函数。但自己写也不难:

if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE"))
我只将hackstack转换为upper一次,以提高性能

或者,您可以使用IndexOfneedle、StringComparison.OrdinalIgnoreCase>=0:

您不应该在这里使用ToUpper,因为它使用当前的区域性。使用当前区域性可能会在某些计算机上导致意外问题,例如,在使用土耳其区域性时,i不大写


可能仍然存在一些微妙的问题,在这两个方面,Toupper不变量和不区分大小写的比较可能会返回不同的结果,但这仅在haystack和Piners中都有不寻常的字符时才相关。

您可以将代码重新编写为类似以下内容:

string[] needles = new string[]{"BOUGHT", "PURCHASE"};
string haystack = description;
bool found = needles.Any(needle=> haystack.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);
如果字符串包含正则表达式控制字符,则可能必须对其进行转义

如果字符串包含正则表达式控制字符,则可能必须对其进行转义


您可以而且应该缓存description.ToUpper的结果。您可能根本不应该使用ToUpper。。。使用IndexOf和适当的字符串比较。上外壳对文化敏感,有时令人惊讶。非常感谢所有的答案。我采纳了几乎所有的概念:您可以而且应该缓存description.ToUpper的结果。您可能根本不应该使用ToUpper。。。使用IndexOf和适当的字符串比较。上外壳对文化敏感,有时令人惊讶。非常感谢所有的答案。我采纳了几乎所有的概念:为什么不仅仅是针头,还有背包?编辑:我明白问题所在,我的错。离开这里是为了说明不该做什么:@leppie,因为这需要整个字符串的匹配。@leppie:haystack可能是你的人生故事,Nikes只是一个单词。@CodeInChaos:注意到并决定正则表达式是正确的TM:为什么不只是Nikes.Containshaystack?编辑:我明白问题所在,我的错。离开这里是为了说明不该做什么:@leppie,因为这需要整个字符串的匹配。@leppie:haystack可能是你的人生故事,针头只是一个单词。@CodeInChaos:注意到并决定Regex是正确的TM这里:这失去了案件敏感性。@CodeInChaos-是的,但他没有要求案件敏感性。他要求提供一种方法来检查多个字符串的条件,最好是在lambda表达式中。这就是我发布的。原始代码使用ToUpper和大写关键字。所以我很确定他想要案件不敏感。这失去了案件不敏感。@CodeInChaos-是的,但他没有要求案件不敏感。他要求提供一种方法来检查多个字符串的条件,最好是在lambda表达式中。这就是我发布的。原始代码使用ToUpper和大写关键字。所以我很确定他想要案件不敏感。这应该可以编译成一个状态机,无论是通过| |还是任何+1调用多次,它都应该比多次调用包含提供更好的性能。这应该可以编译成一个状态机,该状态机应该比多次通过| |或任何方式调用包含提供更好的性能。
if (someCollectionOfStrings.Any(string => originalString.Contains(string))
{
    //stuff
}
Regex.IsMatch(input, string.Join("|", strings));
  if (Regex.IsMatch(description, "purchase|bought", RegexOptions.IgnoreCase)) {
     // ...
  }
public static bool ContainsOneOfManyIgnoreCase(this string str, params string [] items)
    {
      return items.Any(x => str.IndexOf(x, StringComparison.CurrentCultureIgnoreCase) != -1);
    }