Почему у StringBuilder нет метода IndexOf? - PullRequest
19 голосов
/ 01 сентября 2009

Я понимаю, что могу вызвать ToString (). IndexOf (...), но я не хочу создавать дополнительную строку. Я понимаю, что могу написать процедуру поиска вручную. Мне просто интересно, почему такая подпрограмма еще не существует в рамках.

Ответы [ 3 ]

43 голосов
/ 06 июля 2011

Я знаю, что это старый вопрос, однако я написал метод расширения, который выполняет IndexOf для 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;
}
6 голосов
/ 01 сентября 2009

К сожалению, многие из методов, реализованных для String, могли быть реализованы для StringBuilder, но этого не было сделано. Подумайте об использовании методов расширения, чтобы добавить то, что вас волнует.

0 голосов
/ 01 сентября 2009

Вызов ToString() на StringBuilder не создает лишнего объекта, до замешательства. Внутренне StringBuilder хранит объект String для производительности; вызов ToString() просто возвращает этот объект.

...