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

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

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

更新

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

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

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


当前回答

如果您担心国际化(或者您可以重新实现它),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);
}

其他回答

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

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

我知道这不是C#,但在框架(VB.NET)中已经有了这样一个函数

Dim str As String = "UPPERlower"
Dim b As Boolean = InStr(str, "UpperLower")

C#变体:

string myString = "Hello World";
bool contains = Microsoft.VisualBasic.Strings.InStr(myString, "world");
public static class StringExtension
{
    #region Public Methods

    public static bool ExContains(this string fullText, string value)
    {
        return ExIndexOf(fullText, value) > -1;
    }

    public static bool ExEquals(this string text, string textToCompare)
    {
        return text.Equals(textToCompare, StringComparison.OrdinalIgnoreCase);
    }

    public static bool ExHasAllEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index]) == false) return false;
        return true;
    }

    public static bool ExHasEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index])) return true;
        return false;
    }

    public static bool ExHasNoEquals(this string text, params string[] textArgs)
    {
        return ExHasEquals(text, textArgs) == false;
    }

    public static bool ExHasNotAllEquals(this string text, params string[] textArgs)
    {
        for (int index = 0; index < textArgs.Length; index++)
            if (ExEquals(text, textArgs[index])) return false;
        return true;
    }

    /// <summary>
    /// Reports the zero-based index of the first occurrence of the specified string
    /// in the current System.String object using StringComparison.InvariantCultureIgnoreCase.
    /// A parameter specifies the type of search to use for the specified string.
    /// </summary>
    /// <param name="fullText">
    /// The string to search inside.
    /// </param>
    /// <param name="value">
    /// The string to seek.
    /// </param>
    /// <returns>
    /// The index position of the value parameter if that string is found, or -1 if it
    /// is not. If value is System.String.Empty, the return value is 0.
    /// </returns>
    /// <exception cref="ArgumentNullException">
    /// fullText or value is null.
    /// </exception>
    public static int ExIndexOf(this string fullText, string value)
    {
        return fullText.IndexOf(value, StringComparison.OrdinalIgnoreCase);
    }

    public static bool ExNotEquals(this string text, string textToCompare)
    {
        return ExEquals(text, textToCompare) == false;
    }

    #endregion Public Methods
}

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

按索引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);

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

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

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

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

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