Я понимаю, что я могу вызвать ToString(). IndexOf (...), но я не хочу создавать дополнительную строку. Я понимаю, что я могу вручную написать процедуру поиска. Мне просто интересно, почему такая процедура еще не существует в рамках.Почему StringBuilder не имеет метода IndexOf?
ответ
К сожалению, многие методы, реализованные для String, могут быть реализованы для StringBuilder, но это не было сделано. Подумайте об использовании методов расширения, чтобы добавить то, что вам нужно.
Вызов ToString()
на StringBuilder
не создает дополнительный объект, смущенно. Внутренне, StringBuilder
хранит объект String для производительности; вызов ToString()
просто возвращает этот объект.
Я знаю, что это старый вопрос, однако я написал метод расширения, который выполняет 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;
}
Говорят [Используйте метод String.ToUpperInvariant вместо метода String.ToLowerInvariant при нормализации строк для сравнения] (https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices -струны # рекомендации-для-шнуровки использования). Я думаю, это также верно для сравнения символов: [Char.ToUpper и Char.ToLower работают аналогично методам String.ToUpper и String.ToLower, описанным в предыдущем разделе] (https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings # chartoupper-and-chartolower) – Sergey
Справедливый вызов; не стесняйтесь вносить изменения в вышеупомянутый пост. – Dennis
Извините, я ошибся. На самом деле Microsoft оптимизировала * ToUpperInvariant() *, а не * ToUpper() *. В этом случае мы не можем предоставить * ToUpperInvariant() * по умолчанию, поскольку это может привести к неправильному сравнению на некоторых языках, таких как турецкий. Итак, в этом отношении ваш код абсолютно правильный. – Sergey
- 1. Selenium - {[[PromiseStatus]]: "pending"} не имеет метода 'indexOf'
- 2. Недопустимый комментарий javadoc для StringBuilder indexOf?
- 3. IndexOf() из StringBuilder не возвращает ничего
- 4. объект не имеет метод «IndexOf»
- 5. Почему StringBuilder не печатает?
- 6. Оптимизация производительности метода indexOf
- 7. Использование метода indexOf() в JavaScript
- 8. Scala Список indexOf имеет ошибку?
- 9. Почему std :: vector не имеет метода выпуска?
- 10. Почему класс ArrayList не имеет метода newInstance()?
- 11. Почему DataTable.Rows не имеет метода .Where()?
- 12. Почему многопроцессорность.Queue не имеет метода task_done
- 13. Почему карта не имеет метода карты?
- 14. Элемент не имеет метода hasAttribute, Почему?
- 15. Почему XElement не имеет метода GetAttributeValue?
- 16. Почему основной поток не имеет метода останова
- 17. Почему язык Python не имеет метода writeln()?
- 18. Почему TextNode не имеет метода обновления (набора)?
- 19. Почему Java TreeSet не имеет метода get()?
- 20. Почему класс сканера не имеет метода nextChar?
- 21. Почему Stream не имеет метода toList()?
- 22. IndexOf не имеет значения в массиве
- 23. CCNode не имеет члена с именем 'indexOf'
- 24. Конструктор StringBuilder принимает объект StringBuilder - почему?
- 25. indexOf возвращает -1, почему?
- 26. имеет никакого метода «не имеет»
- 27. JAvascript «не имеет метода»
- 28. Почему следующий indexOf не соответствует данной подстроке?
- 29. Почему IndexOf возвращает -1?
- 30. Почему .indexOf() возвращает -1?
это неверно в контексте вопроса, если строковому конструктору предлагается изменить сам себя. Создается строка * new *, изменчивость внутреннего буфера не подвергается управляемому коду. – ShuggyCoUk
@ ShuggyCoUk: мой комментарий был немного ослеп. Я удалил его. –
Чтобы прояснить предыдущий комментарий, из Call ToString не так много накладных расходов. Но после того, как вы его назовете, следующая модификация StringBuilder будет нести накладные расходы. (Это правильная оптимизация, потому что ToString обычно является последней вещью, сделанной для StringBuilder.) В результате этого эффективные реализации String-подобных методов не могут использовать ToString, что исключает тривиальное решение исходной проблемы плаката. –