有没有一种方法可以实现以下返回?

string title = "ASTRINGTOTEST";
title.Contains("string");

似乎没有一个过载允许我设置大小写敏感度。目前,我对这两个问题都有夸大的感觉,但这太傻了(我指的是大小写中的i18n问题)。

更新

这是一个古老的问题,从那时起,我意识到,如果你愿意充分调查,我要求一个非常广泛和困难的问题的简单答案。

对于大多数情况,在单语言、英语代码基础上,这个答案就足够了。我怀疑,因为大多数来这里的人都属于这一类,这是最流行的答案。

然而,这个答案带来了一个固有的问题,即在我们知道两个文本都是相同的文化并且我们知道文化是什么之前,我们不能比较文本不区分大小写。这可能是一个不太流行的答案,但我认为它更正确,这就是我将其标记为这样的原因。


当前回答

这些是最简单的解决方案。

按索引string title=“string”;if(title.IndexOf(“string”,0,StringComparison.CurrentCultureIgnoreCase)!=-1){//包含}通过更改大小写string title=“string”;bool contains=title.ToLower().contains(“string”)由Regex提供Regex.IsMatch(title,“string”,RegexOptions.IgnoreCase);

其他回答

如果您担心国际化(或者您可以重新实现它),VisualBasic程序集的InStr方法是最好的。看看dotNeetWeek,它不仅说明了大写字母和小写字母,还说明了假名类型和全半角字符(大多数与亚洲语言相关,尽管罗马字母表也有全半角版本)。我跳过了一些细节,但请查看私有方法InternalInStrText:

private static int InternalInStrText(int lStartPos, string sSrc, string sFind)
{
  int num = sSrc == null ? 0 : sSrc.Length;
  if (lStartPos > num || num == 0)
    return -1;
  if (sFind == null || sFind.Length == 0)
    return lStartPos;
  else
    return Utils.GetCultureInfo().CompareInfo.IndexOf(sSrc, sFind, lStartPos, CompareOptions.IgnoreCase | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreWidth);
}

.NET Core 2.0+(包括.NET 5.0+)

自2.0版以来,.NET Core有两种方法来处理此问题:

String.Contains(Char,StringComparison)String.Contains(字符串,StringComparison)

例子:

"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);

它现在正式成为.NET标准2.1的一部分,因此也是实现此版本标准(或更高版本)的基类库的所有实现的一部分。

这些是最简单的解决方案。

按索引string title=“string”;if(title.IndexOf(“string”,0,StringComparison.CurrentCultureIgnoreCase)!=-1){//包含}通过更改大小写string title=“string”;bool contains=title.ToLower().contains(“string”)由Regex提供Regex.IsMatch(title,“string”,RegexOptions.IgnoreCase);

为了建立在这里的答案基础上,您可以创建一个字符串扩展方法,使其更加方便用户:

    public static bool ContainsIgnoreCase(this string paragraph, string word)
    {
        return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
    }

OrdinalIgnoreCase、CurrentCultureIgnoreCare或InvariantCultureIgnoleCase?

由于缺少此项,以下是关于何时使用哪项的一些建议:

Dos

使用StringComparison.OrdinalIgnoreCase进行比较作为区域性不可知字符串匹配的安全默认值。使用StringComparison.OrdinalIgnoreCase比较以提高速度。使用StringComparison.CurrentCulture-based字符串操作当向用户显示输出时。基于不变量切换字符串操作的当前使用当比较为语言上不相关(例如象征性的)。在以下情况下使用ToUpperInvariant而不是ToLowerInvariant标准化字符串以进行比较。

不应该做的

对不显式执行的字符串操作使用重载或隐式指定字符串比较机制。使用基于StringComparison.InvariantCulture的字符串大多数情况下的操作;少数例外之一是保持语言上有意义但文化上不可知的数据。


根据这些规则,您应该使用:

string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
    // The string exists in the original
}

而[YourDecision]则取决于上面的建议。

源链接:http://msdn.microsoft.com/en-us/library/ms973919.aspx