2010-08-25 31 views
105

Tôi muốn có một phương thức biến đổi ký tự đầu tiên của chuỗi thành chữ thường.BestPractice - Biến đổi ký tự đầu tiên của chuỗi thành chữ thường

cách tiếp cận của tôi:

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

Điều gì sẽ là cách tiếp cận của bạn?

Trả lời

176

Tôi sẽ sử dụng này:

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

giải pháp đầu tiên của bạn không được tối ưu hóa: string.Format là chậm và bạn không cần nó nếu bạn có một định dạng mà sẽ không bao giờ thay đổi.

Thứ hai là xấu và không thể duy trì.

+3

tôi sẽ làm điều đó:. 'Char.ToLower (tên [0]) ToString() + name.Substring (1) ' – Andrey

+0

có, tôi chỉ cập nhật câu trả lời của tôi, nhờ – onof

+0

Tôi nghĩ rằng ghép của các chuỗi với toán tử + là chậm và xấu xí, phải không? – Rookian

3

Mine là

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

Tôi tò mò, tại sao 'val.Remove'? Có vẻ như một chút phản trực giác với tôi. – Thorarin

+0

@Thorarin rõ ràng là vì bạn muốn xóa char đầu tiên (vì bạn đang thêm phiên bản chữ thường ở phía trước) – riki

44

Tùy thuộc vào tình hình, một chương trình phòng thủ ít có thể là mong muốn:

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

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

Tuyên bố if cũng ngăn cản một chuỗi mới được xây dựng nếu không sẽ đã thay đổi. Bạn có thể muốn có phương pháp thất bại trên đầu vào null thay vào đó, và ném một ArgumentNullException.

Như mọi người đã đề cập, sử dụng String.Format cho điều này là quá mức cần thiết.

+7

+1 để kiểm tra xem bạn có thực sự cần làm gì không. :) – Chris

+0

Sửa lỗi nếu tôi sai nhưng str.Substring (1) sẽ trả về ký hiệu ở vị trí 1 vì số đếm cho phương thức này không được chỉ định. vì vậy bạn sẽ có char [0] trong trường hợp thấp hơn + char tại vị trí 1 Vì vậy, tôi muốn loại bỏ một char bắt đầu từ char đầu tiên trong chuỗi. Kết quả là chuỗi không có chữ cái đầu tiên. Sau đó, tôi sẽ thêm chuỗi này vào char đầu tiên được chuyển đổi thành chữ thường – fedotoves

+2

@ B-Rain: tự xem xét sửa lỗi: http://msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx – Thorarin

2

Tôi thích câu trả lời được chấp nhận, nhưng bên cạnh việc kiểm tra string.IsNullOrEmpty Tôi cũng sẽ kiểm tra xem Char.IsLower(name[1]) trong trường hợp bạn đang xử lý chữ viết tắt hay không. Ví dụ. bạn sẽ không muốn "AIDS" trở thành "AIDS".

+3

IMO đây là trách nhiệm của người gọi – onof

-2

Tốt hơn nên sử dụng String.Concat hơn String.Format nếu bạn biết định dạng đó không thay đổi dữ liệu và chỉ cần ghép nối.

4

Chỉ trong trường hợp nó giúp bất kỳ ai tình cờ gặp phải câu trả lời này.

Tôi nghĩ điều này sẽ là phương pháp mở rộng tốt nhất, sau đó bạn có thể gọi nó bằng 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

Kết hợp một số và làm cho tiện ích mở rộng có thể mở rộng. Thêm ngắn mạch vào khoảng trắng và không phải chữ cái.

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; 
Các vấn đề liên quan