2013-06-13 20 views
9

Ich möchte einen Klassennamen oder Enumerationsnamen nehmen, der Camel-Fall ist und es in normalem Text für den Benutzer anzeigen. Wie kann ich dies programmatisch tun?Wie programmiere ich CamelCase-Namen programmgesteuert zu anzeigbaren Namen

Ein Probeneingang:

MainPageBackgroundColor

Erwartete Ausgabe:

Startseite Hintergrundfarbe

oder

Haupt P Alter Hintergrundfarbe

+0

Kleinbuchstaben die gesamte Zeichenkette dann den ersten Buchstaben groß geschrieben. könnte leicht in einer Zeile Code – Jonesopolis

+0

getan werden Können Sie einige Beispiele geben, was Sie für die Ausgabe möchten? –

+0

Ich sollte auch hinzufügen, dass ich bereits weiß, wie die Enumerationen aussehen, also erwarte ich keine schlechte Codierung. Hier ein Beispiel: BackgroundColor würde dem Benutzer in der Header-Eigenschaft einer Combobox als Hintergrundfarbe angezeigt, und die Werte der Aufzählung füllen die Combobox. Der Benutzer wählt eine Farbe aus und aktualisiert das ViewModel/UI. –

Antwort

8

Sie eine string von Camelcase in eine darstellbare Zeichenfolge durch Leerzeichen getrennt über umwandeln kann:

public static string DisplayCamelCaseString(string camelCase) 
{ 
    List<char> chars = new List<char>(); 
    chars.Add(camelCase[0]); 
    foreach(char c in camelCase.Skip(1)) 
    { 
     if (char.IsUpper(c)) 
     { 
      chars.Add(' '); 
      chars.Add(char.ToLower(c)); 
     } 
     else 
      chars.Add(c); 
    } 

    return new string(chars.ToArray()); 
} 

Diese konvertieren von "CamelCase" zu "Camel case" oder "SomeRandomEnumeration" zu "Some random enumeration".

0

Hier ist die Art, wie ich es zuerst getan habe. Es ist schnell und funktioniert wie erwartet, aber nachdem ich die anderen Antworten gesehen habe, habe ich es zu dem geändert, das ich als Antwort markiert habe.

public static string CamelCaseToDisplayName<T>(this T enumeration) 
{ 
    string name = enumeration.ToString(); 

    for (int i = 1; i < name.Length; i++) 
    { 
     char c = name[i]; 

     if (c >= 'A' && c <= 'Z') 
     { 
      name = name.Remove(i, 1); 
      name = name.Insert(i++, ((char)(c + 0x30)).ToString()); 
      name = name.Insert(i, " "); 
     } 
    } 

    return name; 
} 
+0

Was passiert, wenn die Zeichencodierung anders ist? Die Antwort ist, dass Sie Müllausgabe erhalten.Wenn Sie es lesbarer machen möchten, fügen Sie einfach Leerzeichen ein. Die Namen sind Eigennamen, denn Englisch schreibt vor, dass der erste Buchstabe jedes Wortes in Großbuchstaben geschrieben ist. – evanmcdonnal

+0

Dies wird nicht funktionieren - Entfernen/Einfügen/etc machen neue Zeichenfolgen, sie mutieren nicht die Eingabe ... –

+0

(Sollte 'name = name.Remove (i, 1);', etc) sein Das sagte, Ich würde empfehlen, die in 'System.Char' eingebauten Methoden zu verwenden. –

1
string a = "asdfaGasfdasdAA"; 
a = a.Substring(0,1).ToUpper() + a.Substring(1,a.Length-1).ToLower(); 

Ich nahm Jonesy Kommentar als Herausforderung ...

+1

Beachten Sie, dass dies" SomeRandomEnumeration "in" Somerandomenumeration "umwandelt, was nicht besonders lesbar ist :) –

+0

@ReedCopsey - Ja, aber er will Klassen drehen in Display-Namen, die ein Wort sein;) (zu OP - Sie können .GetType(). toString() Ich denke) – Sayse

+0

Ohne weitere Informationen war dies die genaueste Lösung – Jonesopolis

6

A regex Option:

public static string ToMeaningfulName(this string value) 
{ 
    return Regex.Replace(value, "(?!^)([A-Z])", " $1"); 
} 

Input "MainPageBackgroundColor"

Output- "Hauptseite Hintergrundfarbe"

2

nur Dinge abzurunden, eine alternative Lösung Linq mit mit Erweiterungsmethoden.

public static string ToSentenceCase(this string value) 
{ 
    string[] spacedWords 
     = ((IEnumerable<char>)value).Skip(1) 
     .Select(c => c == char.ToUpper(c) 
      ? " " + char.ToLower(c).ToString() 
      : c.ToString()).ToArray(); 

    string result = value.Substring(0, 1) 
     + (String.Join("", spacedWords)).Trim(); 

    return result; 
} 

Returns: "Startseite Hintergrundfarbe"

public static string ToTitleCase(this string value) 
{ 
    string[] spacedWords 
     = ((IEnumerable<char>)value) 
     .Select(c => c == char.ToUpper(c) 
      ? " " + c.ToString() 
      : c.ToString()).ToArray(); 

    return (String.Join("", spacedWords)).Trim(); 
} 

Returns: "Hauptseite Hintergrundfarbe"

Verwandte Themen