代码之家  ›  专栏  ›  技术社区  ›  thorn0

为什么StringBuilder没有IndexOf方法?

  •  18
  • thorn0  · 技术社区  · 15 年前

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

    3 回复  |  直到 12 年前
        1
  •  52
  •   Dennis    13 年前

    我知道这是一个老问题,但是我已经编写了一个扩展方法来执行 IndexOf StringBuilder . 它在下面。我希望它能帮助任何发现这个问题的人,无论是从 谷歌 搜索 堆栈溢出

    /// <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;
    }
    
        2
  •  7
  •   Jason Kresowaty    15 年前

    不幸的是,为String实现的许多方法本可以为StringBuilder实现,但没有实现。考虑使用扩展方法来添加你关心的内容。

        3
  •  0
  •   Roman Koff    4 年前

    丹尼斯,很好的解决方案。谢谢 我建议稍微优化一下:

    public static int IndexOf(
        this StringBuilder sb,
        string value,
        int startIndex,
        bool ignoreCase)
    {
        int len = value.Length;
        int max = (sb.Length - len) + 1;
        var v1 = (ignoreCase)
            ? value.ToLower() : value;
        var func1 = (ignoreCase)
            ? new Func<char, char, bool>((x, y) => char.ToLower(x) == y)
            : new Func<char, char, bool>((x, y) => x == y);
        for (int i1 = startIndex; i1 < max; ++i1)
            if (func1(sb[i1], v1[0]))
            {
                int i2 = 1;
                while ((i2 < len) && func1(sb[i1 + i2], v1[i2]))
                    ++i2;
                if (i2 == len)
                    return i1;
            }
        return -1;
    }
    
        4
  •  -1
  •   Michael Petrotta user3140870    15 年前

    ToString() StringBuilder 不创建额外的对象,令人困惑。内部,, 字符串拼接 存储字符串对象,以提高性能;使命感 ToString() 只返回该对象。