Ответ 1
Попробовать цепочку методов.
Пример:
var s = " YoUr StRiNg".Trim().ToLower();
Я написал класс для обработки строк, и у меня есть следующая проблема: строка, переданная в, может содержать пробелы в начале и в конце строки.
Мне нужно обрезать пробелы из строк и преобразовать их в строчные буквы. Мой код:
var searchStr = wordToSearchReplacemntsFor.ToLower();
searchStr = searchStr.Trim();
Я не мог найти какую-либо функцию, чтобы помочь мне в StringBuilder
. Проблема в том, что этот класс должен как можно быстрее обрабатывать множество строк. Поэтому я не хочу создавать две новые строки для каждой строки процессов класса.
Если это невозможно, я пойду глубже в алгоритм обработки.
Попробовать цепочку методов.
Пример:
var s = " YoUr StRiNg".Trim().ToLower();
Cyberdrew имеет правильную идею. Если строка является неизменной, вы производите выделение памяти во время обоих этих вызовов. Одна вещь, которую я хотел бы предложить, если вы собираетесь называть string.Trim().ToLower()
во многих местах вашего кода, - это упростить ваши вызовы с помощью методов расширения. Например:
public static class MyExtensions
{
public static string TrimAndLower(this String str)
{
return str.Trim().ToLower();
}
}
Здесь моя попытка. Но прежде чем я это проверил, я задал два очень важных вопроса.
Являются ли последовательные вызовы "String.Trim" и "String.ToLower" действительно влияющими на производительность моего приложения? Кто-нибудь заметил бы, был ли этот алгоритм в два раза медленнее или в два раза быстрее? Единственный способ узнать, как измерить производительность моего кода и сравнить с заранее заданными целями производительности. В противном случае микро-оптимизации будут генерировать выгоды от повышения производительности.
Просто потому, что я написал реализацию, которая появляется быстрее, не означает, что это действительно так. Компилятор и время выполнения могут иметь оптимизации вокруг общих операций, о которых я не знаю. Я должен сравнить время работы моего кода с тем, что уже существует.
static public string TrimAndLower(string str)
{
if (str == null)
{
return null;
}
int i = 0;
int j = str.Length - 1;
StringBuilder sb;
while (i < str.Length)
{
if (Char.IsWhiteSpace(str[i])) // or say "if (str[i] == ' ')" if you only care about spaces
{
i++;
}
else
{
break;
}
}
while (j > i)
{
if (Char.IsWhiteSpace(str[j])) // or say "if (str[j] == ' ')" if you only care about spaces
{
j--;
}
else
{
break;
}
}
if (i > j)
{
return "";
}
sb = new StringBuilder(j - i + 1);
while (i <= j)
{
// I was originally check for IsUpper before calling ToLower, probably not needed
sb.Append(Char.ToLower(str[i]));
i++;
}
return sb.ToString();
}
Если строки используют только символы ASCII, вы можете посмотреть С# ToLower Optimization. Вы также можете попробовать таблицу поиска, если знаете заранее установленный набор символов
Итак, прежде всего, обрезайте сначала и замените второй, так что вам придется перебирать меньшую строку с помощью ToLower()
кроме этого, я думаю, ваш лучший алгоритм будет выглядеть следующим образом: