Hacer la primera letra de una cadena en mayúscula (con el máximo rendimiento)

Resuelto asked hace 13 años • 44 respuestas

Tengo una DetailsViewcon a TextBox y quiero que los datos de entrada se guarden siempre con la primera letra en mayúscula .

Ejemplo:

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

¿Cómo puedo lograr esta maximización del rendimiento ?


Nota :

Según las respuestas y los comentarios debajo de las respuestas, muchas personas piensan que se trata de poner en mayúscula todas las palabras de la cadena. Por ejemplo => Red House , no lo es, pero si eso es lo que busca , busque una de las respuestas que utilice TextInfoel ToTitleCasemétodo. (Nota: esas respuestas son incorrectas para la pregunta realmente formulada). Consulte la documentación de TextInfo.ToTitleCase para conocer las advertencias (no toca las palabras en mayúsculas; se consideran acrónimos; pueden estar en minúsculas en medio de palabras que "no deberían" ser reducido, por ejemplo, "McDonald" → "Mcdonald"; no se garantiza que maneje todas las sutilezas específicas de la cultura con respecto a las reglas de capitalización).


Nota :

La pregunta es ambigua en cuanto a si las letras después de la primera deben escribirse en minúsculas . La respuesta aceptada supone que sólo se debe modificar la primera letra . Si desea forzar que todas las letras de la cadena, excepto la primera , estén en minúsculas, busque una respuesta que contenga ToLowery no contenga ToTitleCase .

 avatar Nov 09 '10 22:11
Aceptado

Solución en diferentes versiones de C#.

C# 8 con al menos .NET Core 3.0 o .NET Standard 2.1

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)),
            _ => string.Concat(input[0].ToString().ToUpper(), input.AsSpan(1))
        };
}

Dado que .NET Core 3.0/.NET Standard 2.1 String.Concat()admite ReadonlySpan<char>, se ahorra una asignación si usamos .AsSpan(1)en lugar de .Substring(1).

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[0].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[0].ToString().ToUpper() + input.Substring(1);
        }
    }
}

Respuestas realmente antiguas

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

Esta versión es más corta. Para una solución más rápida, mira la respuesta de Diego .

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

Probablemente la solución más rápida sea la de Darren (incluso hay un punto de referencia), aunque cambiaría su string.IsNullOrEmpty(s)validación para generar una excepción, ya que el requisito original espera que exista una primera letra para que pueda escribirse en mayúsculas. Tenga en cuenta que este código funciona para una cadena genérica y no particularmente para valores válidos del archivo Textbox.

Carlos Muñoz avatar Dec 10 '2010 05:12 Carlos Muñoz
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();
}

esto también se puede escribir como

public string ToTitleCase(string str)
{
    var firstword = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.Split(' ')[0].ToLower());
    str = str.Replace(str.Split(' ')[0],firstword);
    return str;
}

Donde toma la primera palabra y la convierte a título y luego la reemplaza en la cadena de entrada.

Diego avatar Nov 09 '2010 15:11 Diego

La forma correcta es utilizar Cultura:

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

Nota: Esto pondrá en mayúscula cada palabra dentro de una cadena, por ejemplo, "casa roja" --> "Casa Roja". La solución también utilizará mayúsculas en minúsculas dentro de las palabras, por ejemplo, "viejo McDonald" --> "Viejo Mcdonald".

GPY avatar Apr 28 '2016 12:04 GPY