[C#] 문자열의 첫 글자를 대문자로 만듭니다 (성능 극대화).

나는이 DetailsViewA를을 TextBox
하고 내가 원하는 입력 데이터가 될 수 항상 저장 첫 글자 자본으로.

예:

"red" --> "Red"
"red house" --> " Red house"

최대 성능을 어떻게 달성 할 수 있습니까?


참고 :
답변과 답변 아래의 주석을 기반으로 많은 사람들은 이것이 문자열의 모든 단어를 대문자로 쓰는 것에 대해 묻는 것이라고 생각 합니다. 예를 들어 => Red House , 그렇지 않지만 그것이 원하는 경우TextInfoToTitleCase방법 을 사용하는 답변 중 하나를 찾으십시오 . (참고 : 이 질문에 대한 답변은 실제로 질문 한
내용에 맞지 않습니다 .) 주의 사항에
대해서는 TextInfo.ToTitleCase 문서 를 참조하십시오 (모두 대문자 단어를 건드리지 마십시오. 두문자어로 간주됩니다. 예 : “McDonald”=> “Mcdonald”; 모든 문화권의 미묘한 부분을 대문자로 처리한다는 보장은 없습니다.)


참고 :
질문은 모호한 처음 후에 문자가되어야하는지에 강제 하는 소문자 . 수락 된 답변은 첫 글자 만 변경해야 한다고 가정합니다 . 당신이 강제하려면 첫 번째를 제외하고 문자열의 모든 문자를 소문자로, 답변에 대한보기는 포함 ToLower하고 ToTitleCase을 포함하지 않는 .



답변

C # 8로 업데이트

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
            _ => input.First().ToString().ToUpper() + input.Substring(1)
        };
}

C # 7

public static class StringExtensions
{
    public static string FirstCharToUpper(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().ToUpper() + input.Substring(1);
        }
    }
}

정말 오래된 답변

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}

편집 :이 버전이 더 짧습니다. 빠른 솔루션을 위해 Equiso의 답변을 살펴보십시오.

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + input.Substring(1);
}

편집 2 : 아마도 가장 빠른 해결책은 Darren ( 아마도 벤치 마크가 있음) 일 것입니다. 그러나 string.IsNullOrEmpty(s)원래 요구 사항은 첫 글자가 존재할 것으로 예상되므로 대문자를 사용할 수 있기 때문에 예외를 던지는 유효성 검사를 변경합니다 . 이 코드는 일반 문자열에서 작동하며 특히 유효한 값은 아닙니다.Textbox .


답변

public string FirstLetterToUpper(string str)
{
    if (str == null)
        return null;

    if (str.Length > 1)
        return char.ToUpper(str[0]) + str.Substring(1);

    return str.ToUpper();
}

이전 답변 : 모든 첫 글자를 대문자로 만듭니다.

public string ToTitleCase(string str)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}


답변

올바른 방법은 문화를 사용하는 것입니다.

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())

참고 : 이렇게하면 문자열 내에서 각 단어를 대문자로 표시합니다 (예 : “red house”-> “Red House”). 이 솔루션은 “old McDonald”-> “Old Mcdonald”와 같은 단어 내에서 대문자를 사용합니다.


답변

http://www.dotnetperls.com/uppercase-first-letter 에서 가장 빠른 방법을 사용 하여 확장 방법으로 변환했습니다.

    /// <summary>
    /// Returns the input string with the first character converted to uppercase, or mutates any nulls passed into string.Empty
    /// </summary>
    public static string FirstLetterToUpperCaseOrConvertNullToEmptyString(this string s)
    {
        if (string.IsNullOrEmpty(s))
            return string.Empty;

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

참고 : 사용하는 ToCharArray것이 대안보다 빠르다는 이유 는 char.ToUpper(s[0]) + s.Substring(1)하나의 문자열 만 할당되는 반면 Substring접근 방식은 하위 문자열에 문자열을 할당 한 다음 두 번째 문자열을 사용하여 최종 결과를 구성하기 때문입니다.


편집 : 다음은 CarlosMuñoz 의 초기 테스트와 함께이 접근법이 어떻게 보이는지에 대한 대답입니다 .

    /// <summary>
    /// Returns the input string with the first character converted to uppercase
    /// </summary>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrEmpty(s))
            throw new ArgumentException("There is no first letter");

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }


답변

“ToTitleCase 메서드”를 사용할 수 있습니다

string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house");
//result : Red House

이 확장 방법은 모든 타이틀 케이스 문제를 해결합니다.

사용하기 쉬운

string str = "red house";
str.ToTitleCase();
//result : Red house

string str = "red house";
str.ToTitleCase(TitleCase.All);
//result : Red House

확장 방법

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Test
{
    public static class StringHelper
    {
        private static CultureInfo ci = new CultureInfo("en-US");
        //Convert all first latter
        public static string ToTitleCase(this string str)
        {
            str = str.ToLower();
            var strArray = str.Split(' ');
            if (strArray.Length > 1)
            {
                strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                return string.Join(" ", strArray);
            }
            return ci.TextInfo.ToTitleCase(str);
        }
        public static string ToTitleCase(this string str, TitleCase tcase)
        {
            str = str.ToLower();
            switch (tcase)
            {
                case TitleCase.First:
                    var strArray = str.Split(' ');
                    if (strArray.Length > 1)
                    {
                        strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                        return string.Join(" ", strArray);
                    }
                    break;
                case TitleCase.All:
                    return ci.TextInfo.ToTitleCase(str);
                default:
                    break;
            }
            return ci.TextInfo.ToTitleCase(str);
        }
    }

    public enum TitleCase
    {
        First,
        All
    }
}


답변

오류 검사와 함께 첫 글자 :

public string CapitalizeFirstLetter(string s)
{
    if (String.IsNullOrEmpty(s))
        return s;
    if (s.Length == 1)
        return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
}

그리고 여기는 편리한 확장과 동일합니다

public static string CapitalizeFirstLetter(this string s)
    {
    if (String.IsNullOrEmpty(s)) return s;
    if (s.Length == 1) return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
    }


답변

public static string ToInvarianTitleCase(this string self)
{
    if (string.IsNullOrWhiteSpace(self))
    {
        return self;
    }

    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self);
}