Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Как поменять все прописные на строчные с подчеркиванием?

#c_sharp


Есть строка, в которой нужно заменить все идентификаторы вида
SomeIdentifier

на идентификаторы вида
some_identifier

Готовое решение (работает правильно):
string GetUnderScore(string source)
{
    string target = "";

    foreach (char c in source)
    {
        if (char.IsUpper(c))
        {
            target += "_" + char.ToLower(c);
        }
        else
        {
            target += c;
        }
    }
    if (target[0] == '_')
    {
        target = target.Substring(1);
    }

    return target;
}

но уж как-то много кода для такой простой задачи. Как упростить?    


Ответы

Ответ 1



Можно избавиться от else и второго if и если строки длинные, то лучше использовать StringBuilder вместо string, т.к. StringBuilder не создаёт новую строку с копированием символов из предыдущей при каждом добавлении наших char :) string GetUnderScore(string source) { var result = new StringBuilder(source); foreach (char c in source) { if (char.IsUpper(c) && result.Length > 0) result.Append("_"); result.Append(char.ToLower(c)); } return result.ToString(); }

Ответ 2



Используйте регулярные выражения, они созданы специально для таких задач: string GetUnderScore(string source) { Regex pattern = new Regex(@"(?!^)(?=[A-Z])"); return pattern.Replace(source, "_").ToLower(); }

Ответ 3



Большое количество кода не всегда плохо. Эта функция довольно коротка. Важнее его доступность для поддержки и эффективность. Эффективность будет, если помнить, что строки - это неизменяемые объекты (immutable), каждый оператор += это создание нового объекта, поэтому необходимо использовать StringBuilder. SubString в конце не нужен, просто надо отдельно в начале обрабатывать первую букву, а цикл начинать с 1.

Комментариев нет:

Отправить комментарий