2010-08-25 8 views
105

Me gustaría tener un método que transforme el primer carácter de una cadena en minúsculas.BestPractice - Transformar el primer carácter de una cadena en minúsculas

Mis enfoques:

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

¿Cuál sería su enfoque?

Respuesta

176

usaría esto:

Char.ToLowerInvariant(name[0]) + name.Substring(1) 

Su primera solución no está optimizado: string.Format es lento y que no lo necesita si tiene un formato que nunca cambiará.

El segundo es feo y no se puede mantener.

+3

lo haría:. 'Char.ToLower (nombre [0]) ToString() + name.Substring (1)' – Andrey

+0

sí, sólo estaba actualizando mi respuesta, gracias – onof

+0

pensé que concatenar de las cadenas con el operador + son lentas y feas, ¿no? – Rookian

3

mina es

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

Tengo curiosidad, ¿por qué 'val.Remove'? Parece un poco contra-intuitivo para mí. – Thorarin

+0

@Thorarin obviamente porque quiere eliminar el primer carácter (porque está agregando la versión en minúscula al frente) – riki

44

Dependiendo de la situación, un poco de programación defensiva podría ser deseable:

public static string FirstCharacterToLower(string str) 
{ 
    if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0)) 
     return str; 

    return Char.ToLowerInvariant(str[0]) + str.Substring(1); 
} 

La declaración if también impide una nueva cadena que se construyan si no va a ser cambiado de todos modos. Es posible que desee tener el método de error en la entrada nula en su lugar, y lanzar un ArgumentNullException.

Como han mencionado las personas, el uso de String.Format es excesivo.

+7

+1 para comprobar si realmente necesita hacer algo. :) – Chris

+0

Corrígeme si me equivoco pero str.Substring (1) devolverá el símbolo en la posición 1 ya que el recuento de este método no está indicado. por lo que tendrá char [0] en minúscula + el char en la posición 1 Por lo tanto, prefiero eliminar un carácter a partir del primer carácter en la cadena. El resultado es la cadena sin primera letra. Luego agregaré esta cadena al primer carácter que se convierte en minúscula – fedotoves

+2

@ B-Rain: considérese corregido: http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx – Thorarin

2

Me gusta la respuesta aceptada, pero además de marcar string.IsNullOrEmpty también verificaría si Char.IsLower(name[1]) en caso de que se trate de una abreviatura. P.ej. no querría que "SIDA" se convirtiera en "SIDA".

+3

IMO esto es responsabilidad de la persona que llama – onof

-2

Es mejor utilizar String.Concat que String.Format si sabe que el formato no es datos de cambio, y solo desea concatenación.

4

Solo en caso de que ayude a alguien que encuentre esta respuesta.

Creo que esto sería mejor como un método de extensión, luego puede llamarlo con 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); 
    } 
} 
0

Combinado unos pocos y lo hace una extensión encadenable. Se agregó un cortocircuito en espacios en blanco y sin letras.

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; 
Cuestiones relacionadas