Я понимаю, что я могу вызвать ToString(). IndexOf (...), но я не хочу создавать дополнительную строку. Я понимаю, что я могу вручную написать процедуру поиска. Мне просто интересно, почему такая процедура еще не существует в рамках.
Почему StringBuilder не использует метод IndexOf?
Ответ 1
К сожалению, многие методы, реализованные для String, могут быть реализованы для StringBuilder, но это не было сделано. Подумайте об использовании методов расширения, чтобы добавить то, что вам нужно.
Ответ 2
Я знаю, что это старый вопрос, однако я написал метод расширения, который выполняет 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;
}
Ответ 3
Вызов ToString()
на StringBuilder
не создает лишний объект, смутно. Внутри StringBuilder
хранится объект String для производительности; вызов ToString()
просто возвращает этот объект.