BestPractice-преобразование первого символа строки в нижний регистр
Я хотел бы иметь метод, который преобразует первый символ строки в нижний регистр.
Мои подходы:
1.
public static string ReplaceFirstCharacterToLowerVariant(string name)
{
return String.Format("{0}{1}", name.First().ToString().ToLowerInvariant(), name.Substring(1));
}
2.
public static IEnumerable<char> FirstLetterToLowerCase(string value)
{
var firstChar = (byte)value.First();
return string.Format("{0}{1}", (char)(firstChar + 32), value.Substring(1));
}
Каков будет ваш подход?
8 ответов:
Я бы использовал простую конкатенацию:
Char.ToLowerInvariant(name[0]) + name.Substring(1)Первое решение не оптимизировано, потому что
string.Formatмедленное, и оно вам не нужно, если у вас есть формат, который никогда не изменится. Он также генерирует дополнительную строку, чтобы скрыть букву в нижнем регистре, что не требуется.Подход с "+ 32 " уродлив / не ремонтопригоден, поскольку он требует знания смещений значений символов ASCII. Он также будет генерировать неверные выходные данные с данными Юникода и символами ASCII.
В зависимости от ситуации может быть желательно небольшое защитное Программирование:
public static string FirstCharacterToLower(string str) { if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) return str; return Char.ToLowerInvariant(str[0]) + str.Substring(1); }Оператор
ifтакже предотвращает построение новой строки, если она все равно не будет изменена. Вместо этого вы можете использовать метод fail on null input и броситьArgumentNullException.Как уже упоминалось, использование
String.Formatдля этого является излишним.
Просто на случай, если это поможет любому, кто случайно наткнется на этот ответ.
Я думаю, что это было бы лучше всего в качестве метода расширения, тогда вы можете вызвать его с помощью yourString.FirstCharacterToLower ();
public static class StringExtensions { public static string FirstCharacterToLower(this string str) { if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) { return str; } return Char.ToLowerInvariant(str[0]) + str.Substring(1); } }
Мой
if (!string.IsNullOrEmpty (val) && val.Length > 0) { return val[0].ToString().ToLowerInvariant() + val.Remove (0,1); }
Мне нравится принятый ответ, но помимо проверки
string.IsNullOrEmptyя бы также проверил, еслиChar.IsLower(name[1])в случае, если вы имеете дело с аббревиатурой. Например, вы не хотели бы, чтобы" СПИД "стал"СПИДом".
Объединил несколько и сделал его цепным продолжением. Добавлено короткое замыкание на пробелах и не-буквах.
public static string FirstLower(this string input) => (!string.IsNullOrWhiteSpace(input) && input.Length > 0 && char.IsLetter(input[0]) && !char.IsLower(input[0])) ? input[0].ToString().ToLowerInvariant() + input.Remove(0, 1) : input;
Это небольшой метод расширения, использующий новейший синтаксис и правильные проверки
public static class StringExtensions { public static string FirstCharToLower(this string input) { switch (input) { case null: throw new ArgumentNullException(nameof(input)); case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)); default: return input.First().ToString().ToLower() + input.Substring(1); } } }
Лучше использовать
String.Concat, чемString.Format, Если вы знаете, что формат не изменяет данные, а просто конкатенация желательна.
Comments