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

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

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

更新

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

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

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


当前回答

使用RegEx是一种简单的方法:

Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);

其他回答

您可以使用字符串比较参数(可从.NET Core 2.1及更高版本获得)string.Contains方法。

public bool Contains (string value, StringComparison comparisonType);

例子:

string title = "ASTRINGTOTEST";
title.Contains("string", StringComparison.InvariantCultureIgnoreCase);

使用RegEx是一种简单的方法:

Regex.IsMatch(title, "string", RegexOptions.IgnoreCase);

可以这样使用IndexOf():

string title = "STRING";

if (title.IndexOf("string", 0, StringComparison.OrdinalIgnoreCase) != -1)
{
    // The string exists in the original
}

由于0(零)可以是索引,因此请检查-1。

Microsoft.NET文档:

如果找到该字符串,则值参数从当前实例开始的从零开始的索引位置,如果没有,则为-1。如果值为空,则返回值为startIndex。

与前面的答案类似(使用扩展方法),但有两个简单的空检查(C#6.0及以上版本):

public static bool ContainsIgnoreCase(this string source, string substring)
{
    return source?.IndexOf(substring ?? "", StringComparison.OrdinalIgnoreCase) >= 0;
}

如果源为空,则返回false(通过空传播运算符?)

如果子字符串为空,则将其视为空字符串并返回true(通过空合并运算符??)

如果需要,StringComparison当然可以作为参数发送。

.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的一部分,因此也是实现此版本标准(或更高版本)的基类库的所有实现的一部分。