为什么StringBuilder没有IndexOf方法?

tho*_*rn̈ 19 .net stringbuilder

我知道我可以调用ToString().IndexOf(...),但我不想创建额外的字符串.我知道我可以手动编写搜索例程.我只是想知道为什么框架中不存在这样的例程.

Den*_*nis 46

我知道这是一个老问题,但是我已经编写了一个执行IndexOfon的扩展方法StringBuilder.它在下面.我希望通过Google搜索或搜索StackOverflow帮助任何人找到这个问题.

/// <summary>
/// Returns the index of the start of the contents in a StringBuilder
/// </summary>        
/// <param name="value">The string to find</param>
/// <param name="startIndex">The starting index.</param>
/// <param name="ignoreCase">if set to <c>true</c> it will ignore case</param>
/// <returns></returns>
public static int IndexOf(this StringBuilder sb, string value, int startIndex, bool ignoreCase)
{            
    int index;
    int length = value.Length;
    int maxSearchLength = (sb.Length - length) + 1;

    if (ignoreCase)
    {
        for (int i = startIndex; i < maxSearchLength; ++i)
        {
            if (Char.ToLower(sb[i]) == Char.ToLower(value[0]))
            {
                index = 1;
                while ((index < length) && (Char.ToLower(sb[i + index]) == Char.ToLower(value[index])))
                    ++index;

                if (index == length)
                    return i;
            }
        }

        return -1;
    }

    for (int i = startIndex; i < maxSearchLength; ++i)
    {
        if (sb[i] == value[0])
        {
            index = 1;
            while ((index < length) && (sb[i + index] == value[index]))
                ++index;

            if (index == length)
                return i;
        }
    }

    return -1;
}
Run Code Online (Sandbox Code Playgroud)

  • 对不起我错了。实际上,Microsoft已经优化了* ToUpperInvariant()*,而不是* ToUpper()*。在这种情况下,我们默认情况下无法提供* ToUpperInvariant()*,因为它会导致某些语言(如土耳其语)的错误比较。因此,就此而言,您的代码绝对正确。 (3认同)
  • 可以的,没错。感谢您回来并再次发表评论。:+1: (2认同)

Jas*_*aty 6

不幸的是,为String实现的许多方法都可以为StringBuilder实现,但是没有完成.考虑使用扩展方法添加您关心的内容.