BestPractice - преобразовать первый символ строки в нижний регистр - PullRequest
127 голосов
/ 25 августа 2010

Я хотел бы иметь метод, который преобразует первый символ строки в нижний регистр.

Мои подходы:

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));
}

Каков будет ваш подход?

Ответы [ 10 ]

222 голосов
/ 25 августа 2010

Я бы использовал простую конкатенацию:

Char.ToLowerInvariant(name[0]) + name.Substring(1)

Первое решение не оптимизировано, поскольку string.Format медленное, и оно вам не нужно, если у вас есть формат, который никогда не изменится. Он также генерирует дополнительную строку для преобразования буквы в нижний регистр, которая не нужна.

Подход с "+ 32" уродлив / не поддается ремонту, так как требует знания смещений значений символов ASCII. Он также будет генерировать неверный вывод с данными Unicode и символьными символами ASCII.

58 голосов
/ 25 августа 2010

В зависимости от ситуации может потребоваться небольшое защитное программирование:

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 для этого является излишним.

5 голосов
/ 12 апреля 2016

На всякий случай это поможет любому, кто случайно наткнется на этот ответ.

Я думаю, что это было бы лучше всего в качестве метода расширения, тогда вы можете вызвать его с помощью 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);
    }
}
3 голосов
/ 25 августа 2010

Шахта

if (!string.IsNullOrEmpty (val) && val.Length > 0)
{
    return val[0].ToString().ToLowerInvariant() + val.Remove (0,1);   
}
2 голосов
/ 17 января 2012

Мне нравится принятый ответ, но помимо проверки string.IsNullOrEmpty Я бы также проверил, если Char.IsLower(name[1]), если вы имеете дело с сокращением. Например. Вы не хотели бы, чтобы «СПИД» стал «СПИДом».

0 голосов
/ 23 февраля 2019

Самое быстрое из известных мне решений без злоупотребления c #:

public static string LowerCaseFirstLetter(string value)
{
    if (value?.Length > 0)
    {
        var letters = value.ToCharArray();
        letters[0] = char.ToLowerInvariant(letters[0]);
        return new string(letters);
    }
    return value;
}
0 голосов
/ 01 января 2019

Используйте это:

string newName= name[0].ToString().ToLower() + name.Substring(1)
0 голосов
/ 11 июля 2018

Это небольшой метод расширения, использующий последний синтаксис и правильные проверки

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);
        }
    }
}
0 голосов
/ 15 февраля 2018

Объединили несколько и сделали это цепным расширением. Добавлено короткое замыкание на пробел и не букву.

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;
0 голосов
/ 20 августа 2013

Лучше использовать String.Concat, чем String.Format, если вы знаете, что формат не изменяет данные, и требуется просто конкатенация.

...