[C#] 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));
}

당신의 접근 방식은 무엇입니까?



답변

간단한 연결을 사용합니다.

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명령문은 새 문자열이 변경되지 않을 경우 빌드되지 않도록합니다. 대신 null 입력에서 메소드가 실패하도록하고을 던질 수 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]). 예를 들어 “AIDS”가 “aIDS”가되는 것을 원하지 않을 것입니다.


답변

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


답변

몇 가지를 결합하여 연결 가능한 확장으로 만들었습니다. 공백 및 문자 이외의 단락이 추가되었습니다.

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;