Самый быстрый способ обрезать строку и преобразовать ее в нижний регистр

Я написал класс для обработки строк, и у меня есть следующая проблема: строка, переданная в, может содержать пробелы в начале и в конце строки.

Мне нужно обрезать пробелы из строк и преобразовать их в строчные буквы. Мой код:

var searchStr = wordToSearchReplacemntsFor.ToLower();
        searchStr = searchStr.Trim();

Я не мог найти какую-либо функцию, чтобы помочь мне в StringBuilder. Проблема в том, что этот класс должен как можно быстрее обрабатывать множество строк. Поэтому я не хочу создавать две новые строки для каждой строки процессов класса.

Если это невозможно, я пойду глубже в алгоритм обработки.

Ответы

Ответ 1

Попробовать цепочку методов.

Пример:

var s = " YoUr StRiNg".Trim().ToLower();

Ответ 2

Cyberdrew имеет правильную идею. Если строка является неизменной, вы производите выделение памяти во время обоих этих вызовов. Одна вещь, которую я хотел бы предложить, если вы собираетесь называть string.Trim().ToLower() во многих местах вашего кода, - это упростить ваши вызовы с помощью методов расширения. Например:

public static class MyExtensions
{
    public static string TrimAndLower(this String str)
    {
        return str.Trim().ToLower();
    }
}   

Ответ 3

Здесь моя попытка. Но прежде чем я это проверил, я задал два очень важных вопроса.

  • Являются ли последовательные вызовы "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();
    }
    

Ответ 4

Если строки используют только символы ASCII, вы можете посмотреть С# ToLower Optimization. Вы также можете попробовать таблицу поиска, если знаете заранее установленный набор символов

Ответ 5

Итак, прежде всего, обрезайте сначала и замените второй, так что вам придется перебирать меньшую строку с помощью ToLower()

кроме этого, я думаю, ваш лучший алгоритм будет выглядеть следующим образом:

  • Итерации по строке один раз и проверьте
    • существуют ли символы верхнего регистра
    • Есть ли пробелы в начале и конце (и подсчет количества символов, о которых вы говорите)
  • если ничего из вышеизложенного не вернет исходную строку
  • если верхний регистр, но без пробелов: do ToLower и return
  • если пробелы:
    • выделить новую строку с правильным размером (исходная длина - количество белых символов)
    • заполните его при выполнении функции ToLower