2013-06-13 19 views
9

Chciałbym wziąć nazwę klasy lub wyliczenie, które jest wielbłąda i wyświetlić go w normalnym tekście dla użytkownika. Jak mogę to programowo zrobić?Jak programowo zmienić nazwy CamelCase na nazwy wyświetlane

Wejście próbki:

MainPageBackgroundColor

oczekiwany wynik:

Strona główna kolor tła

lub

Main P wiek Kolor tła

+0

małe litery cały ciąg potem wielkie litery pierwszej litery. można łatwo zrobić w jednym wierszu kodu. – Jonesopolis

+0

Czy możesz podać kilka próbek tego, co chcesz na wyjściu? –

+0

Powinienem także dodać, że już wiem, jak wyglądają wyliczenia, więc nie oczekuję złego kodowania. Oto przykład: BackgroundColor będzie wyświetlany użytkownikowi jako kolor tła w właściwości nagłówka combobox, a wartości wyliczeniowe wypełniają pole wyboru. Użytkownik wybiera kolor i aktualizuje ViewModel/UI. –

Odpowiedz

8

można przekonwertować string z CamelCase do wyświetlanej ciąg oddzielonych spacjami poprzez:

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

To przekonwertuje od "CamelCase" do "Camel case" lub "SomeRandomEnumeration" do "Niektóre losowe wyliczenia".

0

Oto sposób, w jaki to zrobiłem. Jest szybka i działa zgodnie z oczekiwaniami, ale po zobaczeniu innych odpowiedzi zmieniłem ją na tę, którą zaznaczyłem jako odpowiedź.

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

Co się dzieje, gdy kodowanie znaków jest inne? Odpowiedź brzmi: otrzymujesz wyjście śmieci.Jeśli chcesz, aby było bardziej czytelne, wystarczy wstawić spacje. W końcu nazwy są rzeczownikami własnymi, angielski dyktuje, że pierwsza litera każdego słowa jest wielka. – evanmcdonnal

+0

To nie zadziała - Usuń/Wstaw/etc tworzyć nowe ciągi, nie zmieniają one wejścia ... –

+0

(Powinno to być 'name = name.Remove (i, 1);', itp.) W związku z tym, Sugeruję użycie metod wbudowanych w 'System.Char') –

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

wziąłem komentarz Jonesy jako wyzwanie ...

+1

Zauważ, że to zmieni" SomeRandomEnumeration "w" Somerandomenumeration ", co nie jest szczególnie czytelne dla człowieka :) –

+0

@ReedCopsey - Tak, ale chce zmienić klasę do wyświetlanych nazw, które będą jednym słowem;) (do OP - możesz .GetType(). toString() myślę) – Sayse

+0

Bez więcej informacji to było najdokładniejsze rozwiązanie – Jonesopolis

6

regex opcja:

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

Input "MainPageBackgroundColor"

Output- "Strona główna Kolor tła"

2

Wystarczy zaokrąglić rzeczy, alternatywne rozwiązanie przy użyciu LINQ z metodami rozszerzenia.

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

Powroty: "główny kolor tła strony"

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

Powroty: "Main Page Kolor tła"

Powiązane problemy