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, если вы знаете, что формат не является изменением данных, и требуется просто конкатенация.