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

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

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

更新

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

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

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


当前回答

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

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

其他回答

答案的一个问题是,如果字符串为空,它将抛出异常。您可以将其添加为支票,这样就不会:

public static bool Contains(this string source, string toCheck, StringComparison comp)
{
    if (string.IsNullOrEmpty(toCheck) || string.IsNullOrEmpty(source))
        return true;

    return source.IndexOf(toCheck, comp) >= 0;
} 

这里的技巧是查找字符串,忽略大小写,但保持完全相同(大小写相同)。

 var s="Factory Reset";
 var txt="reset";
 int first = s.IndexOf(txt, StringComparison.InvariantCultureIgnoreCase) + txt.Length;
 var subString = s.Substring(first - txt.Length, txt.Length);

输出为“重置”

这与这里的其他示例非常相似,但我决定将enum简化为bool,因为通常不需要其他替代方法。下面是我的例子:

public static class StringExtensions
{
    public static bool Contains(this string source, string toCheck, bool bCaseInsensitive )
    {
        return source.IndexOf(toCheck, bCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal) >= 0;
    }
}

用法如下:

if( "main String substring".Contains("SUBSTRING", true) )
....

可以这样使用IndexOf():

string title = "STRING";

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

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

Microsoft.NET文档:

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

if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;}