2010-08-25 9 views
105

Ich hätte gerne eine Methode, die das erste Zeichen einer Zeichenkette in Kleinbuchstaben umwandelt.BestPractice - Verwandle das erste Zeichen einer Zeichenkette in Kleinbuchstaben

Meine Ansätze:

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

Was ist Ihr Ansatz wäre?

Antwort

176

Ich würde verwenden:

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

Ihre erste Lösung ist nicht optimiert: string.Format langsam ist und Sie brauchen es nicht, wenn Sie ein Format haben, das nie ändern wird.

Die zweite ist hässlich und nicht wartbar.

+3

ich würde es tun. 'Char.ToLower (Name [0]) ToString() + name.Substring (1)' – Andrey

+0

Ja, ich war meine Antwort nur zu aktualisieren, dank – onof

+0

Ich dachte, dass Verketten von Strings mit dem Operator + ist langsam und hässlich, oder? – Rookian

3

Meins ist

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

Ich bin neugierig, warum die 'val.Remove'? Scheint ein wenig kontraintuitiv zu mir. – Thorarin

+0

@Thorarin offensichtlich, weil Sie das erste Zeichen entfernen möchten (weil Sie die Kleinbuchstabe-Version in Front hinzufügen) – riki

44

Je nach Situation, eine wenig defensive Programmierung wünschenswert sein könnte:

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

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

Die if Anweisung verhindert auch eine neue Zeichenfolge aus gebaut werden, wenn es wird nicht sein änderte sich trotzdem. Möglicherweise möchten Sie stattdessen, dass die Methode bei der Nulleingabe fehlschlägt, und eine ArgumentNullException auslösen.

Wie bereits erwähnt, ist die Verwendung von String.Format dafür Overkill.

+7

+1 für die Überprüfung, ob Sie tatsächlich überhaupt etwas tun müssen. :) – Chris

+0

Korrigieren Sie mich, wenn ich falsch liege, aber str.Substring (1) wird das Symbol an der Position 1 zurückgeben, da die Anzahl für diese Methode nicht angezeigt wird. so haben Sie char [0] in Kleinbuchstaben + das Zeichen an Position 1 So zog ich es vor, ein Zeichen beginnend mit dem ersten Zeichen in der Zeichenfolge zu entfernen. Das Ergebnis ist die Zeichenfolge ohne Anfangsbuchstaben. Dann werde ich diese Zeichenfolge zum ersten Zeichen hinzufügen, das in Kleinbuchstaben umgewandelt wird – fedotoves

+2

@ B-Rain: Betrachten Sie sich als korrigiert: http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx – Thorarin

2

Ich mag die angenommene Antwort, aber neben Überprüfung string.IsNullOrEmpty würde ich auch überprüfen, ob Char.IsLower(name[1]), falls Sie mit Abkürzung beschäftigen. Z.B. Sie würden nicht wollen, dass "AIDS" zu "AIDS" wird.

+3

IMO ist dies die Verantwortung des Anrufers – onof

-2

Es ist besser, String.Concat als String.Format zu verwenden, wenn Sie wissen, dass das Format keine Änderungsdaten ist und nur eine Verkettung gewünscht wird.

4

Nur für den Fall, dass es jedem hilft, der zufällig über diese Antwort stolpert.

Ich denke, das wäre am besten als eine Erweiterungsmethode, dann können Sie es mit yourString.FirstCharacterToLower() aufrufen;

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

Kombiniert ein paar und machte es zu einer verkettbaren Erweiterung. Kurzschluss in Whitespace und Non-Letter hinzugefügt.

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; 
Verwandte Themen