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

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

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

更新

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

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

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


当前回答

可以这样使用IndexOf():

string title = "STRING";

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

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

Microsoft.NET文档:

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

其他回答

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

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
}

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

 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);

输出为“重置”

使用Regex的替代解决方案:

bool contains = Regex.IsMatch("StRiNG to search", Regex.Escape("string"), RegexOptions.IgnoreCase);
if ("strcmpstring1".IndexOf(Convert.ToString("strcmpstring2"), StringComparison.CurrentCultureIgnoreCase) >= 0){return true;}else{return false;}