programing

모범 사례 - 문자열의 첫 번째 문자를 소문자로 변환

lastcode 2023. 8. 15. 11:08
반응형

모범 사례 - 문자열의 첫 번째 문자를 소문자로 변환

문자열의 첫 번째 문자를 소문자로 변환하는 방법을 원합니다.

내 접근 방식:

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이건 과잉 살상이기 때문입니다

혹시라도 이 답을 우연히 발견한 사람에게 도움이 될 경우에 대비해서요.

이것이 확장 방법으로 가장 좋을 것 같습니다, 그러면 당신의 String과 함께 호출할 수 있습니다.첫 번째 문자부터 아래()까지;

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

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

내꺼는

if (!string.IsNullOrEmpty (val) && val.Length > 0)
{
    return val[0].ToString().ToLowerInvariant() + val.Remove (0,1);   
}

수락된 답변이 마음에 들지만 확인 외에string.IsNullOrEmpty또한 확인해 보겠습니다.Char.IsLower(name[1])약어를 다루는 경우.예를 들어, "AIDS"가 "aIDS"가 되는 것을 원하지 않을 것입니다.

당신이 성능에 관심이 있다면 저는 함께 갈 것입니다.

  public static string FirstCharToLower(this string str)
    => string.Create(str.Length, str, (output, input) =>
      {
        input.CopyTo(output);
        output[0] = char.ToLowerInvariant(input[0]);
      });

빠른 벤치마킹을 몇 가지 해봤는데, 여기에 게시된 가장 빠른 솔루션보다 최소 두 배, 여러 입력 길이에서 최악의 솔루션보다 3.5배 더 빠른 것 같습니다.

발신자의 책임이므로 입력 확인은 없습니다.데이터를 미리 준비하고 필요한 경우 핫패스에 지점을 배치하여 대량 처리 속도를 늦추지 않고 신속하게 데이터를 처리할 수 있습니다.

범위 연산자 C# 8.0 이상을 사용하면 다음을 수행할 수 있습니다.

Char.ToLowerInvariant(name[0]) + 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 newName= name[0].ToString().ToLower() + name.Substring(1);

표현식에서 문자열을 두 번 참조하지 않으려면 다음을 사용하여 수행할 수 있습니다.System.Linq.

new string("Hello World".Select((c, i) => i == 0 ? char.ToLower(c) : c).ToArray())

이렇게 하면 문자열이 함수에서 가져온 경우 해당 함수의 결과를 저장할 필요가 없습니다.

new string(Console.ReadLine().Select((c, i) => i == 0 ? char.ToLower(c) : c).ToArray())

사용하는 것이 더 좋습니다.String.ConcatString.Format형식이 데이터 변경이 아니며 연결만 필요하다는 것을 알고 있는 경우.

언급URL : https://stackoverflow.com/questions/3565015/bestpractice-transform-first-character-of-a-string-into-lower-case

반응형