2013-06-13 32 views
9

Tôi muốn lấy tên lớp hoặc tên điều tra là trường hợp lạc đà và hiển thị tên đó trong văn bản thông thường cho người dùng. Làm thế nào tôi có thể lập trình làm điều này?Làm cách nào để thay đổi tên CamelCase thành tên có thể hiển thị theo cách lập trình

Một đầu vào mẫu:

MainPageBackgroundColor

sản lượng dự kiến:

nền Trang chính màu

hoặc

Main P age Background Color

+0

chữ thường toàn bộ chuỗi sau đó chữ hoa chữ cái đầu tiên. có thể được thực hiện dễ dàng trong một dòng mã – Jonesopolis

+0

Bạn có thể đưa ra một số mẫu của những gì bạn muốn cho đầu ra không? –

+0

Tôi cũng nên thêm rằng tôi đã biết những gì enumerations trông như thế, vì vậy tôi không mong đợi mã hóa xấu. Dưới đây là một ví dụ: BackgroundColor sẽ được hiển thị cho người dùng dưới dạng màu nền trong thuộc tính Tiêu đề của combobox và các giá trị của liệt kê được điền vào hộp tổ hợp. Người dùng chọn một màu và nó cập nhật ViewModel/UI. –

Trả lời

8

Bạn có thể chuyển đổi một string từ CamelCase thành một chuỗi thể hiển thị bằng dấu cách qua:

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

này sẽ chuyển đổi từ "CamelCase" thành "Camel case" hoặc "SomeRandomEnumeration" thành "Some random enumeration".

0

Đây là cách đầu tiên tôi làm. Nó nhanh và hoạt động như mong đợi, nhưng sau khi nhìn thấy các câu trả lời khác, tôi đã thay đổi nó thành câu trả lời mà tôi đã đánh dấu là Trả lời.

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

Điều gì sẽ xảy ra khi mã hóa ký tự khác nhau? Câu trả lời là bạn nhận được đầu ra rác.Nếu bạn muốn làm cho nó dễ đọc hơn, chỉ cần chèn khoảng trắng. Các tên là danh từ thích hợp sau khi tất cả, tiếng Anh ra lệnh chữ cái đầu tiên của mỗi từ là chữ hoa. – evanmcdonnal

+0

Điều này sẽ không hoạt động - Xóa/Chèn/etc tạo chuỗi mới, chúng không làm thay đổi đầu vào ... –

+0

(Nên là 'name = name.Remove (i, 1);', v.v.) Tôi khuyên bạn nên sử dụng các phương pháp được tích hợp vào 'System.Char') –

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

tôi đã bình luận Jonesy như là một thách thức ...

+1

Lưu ý rằng điều này sẽ biến" SomeRandomEnumeration "thành" Somerandomenumeration ", không đặc biệt là con người có thể đọc được :) –

+0

@ReedCopsey - Có, nhưng anh ấy muốn chuyển lớp vào tên hiển thị sẽ là một từ;) (để OP - bạn có thể .GetType(). toString() Tôi nghĩ) – Sayse

+0

Nếu không có thêm thông tin thì đây là giải pháp chính xác nhất – Jonesopolis

6

Một lựa chọn regex:

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

Input "MainPageBackgroundColor"

Output- "Page Main Background Color"

2

Chỉ cần để làm tròn những điều trên, một giải pháp thay thế sử dụng LINQ với các phương pháp mở rộng.

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: "Main màu nền trang"

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: "Main Page Background Color"

Các vấn đề liên quan