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


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

646   8  

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

    Ничего не найдено.