#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.
Комментариев нет:
Отправить комментарий