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));
}
Каким будет ваш подход?
Ответы
Ответ 1
Я бы использовал это:
Char.ToLowerInvariant(name[0]) + name.Substring(1)
Ваше первое решение не оптимизировано: string.Format медленный, и вам это не нужно, если у вас есть формат, который никогда не изменится.
Второй уродливый и не ремонтируемый.
Ответ 2
В зависимости от ситуации может потребоваться небольшое защитное программирование:
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
также запрещает создание новой строки, если она не будет изменена в любом случае. Возможно, вы захотите, чтобы этот метод завершился неудачей при подаче нулевого ввода и выбрал ArgumentNullException
.
Как уже упоминалось, использование String.Format
для этого является излишним.
Ответ 3
На всякий случай это помогает любому, кто случайно наткнется на этот ответ.
Я думаю, что это было бы лучше всего в качестве метода расширения, тогда вы можете вызвать его с помощью 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);
}
}
Ответ 4
Шахта
if (!string.IsNullOrEmpty (val) && val.Length > 0)
{
return val[0].ToString().ToLowerInvariant() + val.Remove (0,1);
}
Ответ 5
Мне нравится принятый ответ, но, помимо проверки string.IsNullOrEmpty
, я также проверил бы, если Char.IsLower(name[1])
, если вы имеете дело с аббревиатурой. Например. вы бы не хотели, чтобы "СПИД" стал "СПИД".
Ответ 6
Лучше использовать String.Concat, чем String.Format, если вы знаете, что формат не является изменением данных, и требуется просто конкатенация.