2010-08-25 8 views
105

Mi piacerebbe avere un metodo che trasformi il primo carattere di una stringa in lettere minuscole.BestPractice - Trasforma il primo carattere di una stringa in lettere minuscole

miei approcci:

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

Quale sarebbe il vostro approccio?

risposta

176

userei questo:

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

tua prima soluzione non è ottimizzato: string.Format è lento e non c'è bisogno che se si dispone di un formato che non cambierà mai.

Il secondo è brutto e non gestibile.

+3

lo farei:. 'Char.ToLower (nome [0]) ToString() + name.Substring (1)' – Andrey

+0

sì, ero solo aggiornando la mia risposta, grazie – onof

+0

ho pensato che concatination di le stringhe con l'operatore + sono lente e brutte, no? – Rookian

3

mio è

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

Sono curioso, perché il 'val.Remove'? Sembra un po 'controintuitivo per me. – Thorarin

+0

@Thorarin ovviamente perché vuoi rimuovere il primo carattere (perché stai aggiungendo la versione minuscola nella parte anteriore) – riki

44

A seconda della situazione, un po 'di programmazione difensiva potrebbe essere desiderabile:

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 dichiarazione if impedisce anche una nuova stringa da essere costruito se non sarà cambiato comunque. Potresti volere che il metodo abbia esito negativo sull'input nullo e gettare uno ArgumentNullException.

Come le persone hanno menzionato, l'utilizzo di String.Format per questo è eccessivo.

+7

+1 per verificare se effettivamente devi fare qualcosa. :) – Chris

+0

Correggetemi se ho torto ma str.Substring (1) restituirà il simbolo nella posizione 1 poiché il conteggio per questo metodo non è indicato. quindi avrai il carattere [0] in minuscolo + il carattere in posizione 1 Quindi ho preferito rimuovere un carattere a partire dal primo carattere nella stringa. Il risultato è la stringa senza prima lettera. Quindi aggiungerò questa stringa al primo carattere convertito in minuscolo – fedotoves

+2

@ B-Rain: considera corretto te stesso: http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx – Thorarin

2

Mi piace la risposta accettata, ma oltre a controllare string.IsNullOrEmpty vorrei anche verificare se Char.IsLower(name[1]) nel caso si tratti di abbreviazione. Per esempio. non vorresti che "l'AIDS" diventasse "AIDS".

+3

IMO questa è la responsabilità del chiamante – onof

-2

È preferibile utilizzare String.Concat rispetto a String.Format se si sa che il formato non è il dato di modifica e si desidera una semplice concatenazione.

4

Nel caso in cui aiuti chiunque capiti di imbattersi in questa risposta.

Penso che questo sia il miglior metodo di estensione, quindi puoi chiamarlo 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

Combinato alcuni e ne ha fatto un'estensione concatenabile. Aggiunto cortocircuito su spazio bianco e non lettera.

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; 
Problemi correlati