2011-02-05 19 views
69

Chúc mừng tất cả mọi người ... Tôi cần phải Trim một String. Nhưng tôi muốn loại bỏ tất cả các khoảng trắng lặp lại trong chính chuỗi đó, không chỉ ở cuối hoặc ở đầu nó. Tôi có thể làm điều đó với một phương pháp như:Làm cách nào để mở rộng các kiểu dựng sẵn C#, như Chuỗi?

public static string ConvertWhitespacesToSingleSpaces(string value) 
{ 
    value = Regex.Replace(value, @"\s+", " "); 
} 

Tôi nhận được từ here. Nhưng tôi muốn đoạn mã này được gọi trong chính số String.Trim(), vì vậy tôi nghĩ rằng tôi cần phải mở rộng hoặc quá tải hoặc ghi đè phương thức Trim ... Có cách nào để làm điều đó không?

Xin cảm ơn trước.

Trả lời

118

Vì bạn không thể mở rộng chuỗi.Trim(). Bạn có thể làm cho một phương pháp mở rộng như mô tả here mà trims và giảm khoảng trắng.

namespace CustomExtensions 
{ 
    //Extension methods must be defined in a static class 
    public static class StringExtension 
    { 
     // This is the extension method. 
     // The first parameter takes the "this" modifier 
     // and specifies the type for which the method is defined. 
     public static string TrimAndReduce(this string str) 
     { 
      return ConvertWhitespacesToSingleSpaces(str).Trim(); 
     } 

     public static string ConvertWhitespacesToSingleSpaces(this string value) 
     { 
      return Regex.Replace(value, @"\s+", " "); 
     } 
    } 
} 

Bạn có thể sử dụng nó như vậy

using CustomExtensions; 

string text = " I'm wearing the cheese. It isn't wearing me! "; 
text = text.TrimAndReduce(); 

Cung cấp cho bạn

text = "I'm wearing the cheese. It isn't wearing me!"; 
+0

Tệp có cần một tên đặc biệt không? Hoặc bạn lưu nó ở đâu? Nó có thể được putted vào một lớp Util hoặc một cái gì đó như thế? – testing

+1

@testing Bạn có thể đặt chúng ở bất cứ đâu miễn là chúng được tham chiếu trong dự án của bạn. Nếu bạn đặt chúng vào một không gian tên cụ thể, chỉ cần mang chúng vào với câu lệnh 'sử dụng' như bất kỳ lớp nào khác. – Twicetimes

+0

tại sao bạn không trả lại regex ngay từ chức năng TrimAndReduce? nó sẽ làm cho câu trả lời của bạn đơn giản hơn nhiều để đọc.Trừ khi bạn sử dụng câu trả lời của bạn rất nhiều mà bạn cần phải gọi ở nơi khác LOL – quemeful

20

Có thể không? Có, nhưng chỉ với phương pháp mở rộng

Lớp System.String được niêm phong để bạn không thể sử dụng ghi đè hoặc thừa kế.

public static class MyStringExtensions 
{ 
    public static string ConvertWhitespacesToSingleSpaces(this string value) 
    { 
    return Regex.Replace(value, @"\s+", " "); 
    } 
} 

// usage: 
string s = "test !"; 
s = s.ConvertWhitespacesToSingleSpaces(); 
+5

Để rõ ràng, không, không thể sửa đổi các hành động mà 'String.Trim' thực hiện. –

7

Extension methods!

public static class MyExtensions 
{ 
    public static string ConvertWhitespacesToSingleSpaces(this string value) 
    { 
     return Regex.Replace(value, @"\s+", " "); 
    } 
} 
9

Có một yes và một không với câu hỏi của bạn.

Có, bạn có thể mở rộng các loại hiện có bằng cách sử dụng các phương pháp mở rộng. Phương pháp mở rộng, tự nhiên, chỉ có thể truy cập vào giao diện công khai của loại.

public static string ConvertWhitespacesToSingleSpaces(this string value) {...} 

// some time later... 
"hello world".ConvertWhitespacesToSingleSpaces() 

Không, bạn không thể gọi phương thức này Cắt(). Các phương thức mở rộng không tham gia vào quá tải. Tôi nghĩ rằng một trình biên dịch thậm chí sẽ cung cấp cho bạn một thông báo lỗi chi tiết này.

Phương thức mở rộng chỉ hiển thị nếu không gian tên chứa loại xác định phương thức đang sử dụng'ed.

2

Ngoài việc sử dụng phương pháp mở rộng - có thể là một ứng cử viên tốt đây - nó cũng có thể để "bọc" một đối tượng (ví dụ: "thành phần đối tượng"). Miễn là hình thức bọc không chứa nhiều thông tin hơn thứ được bọc thì vật phẩm được bọc có thể được chuyển qua các chuyển đổi ngầm hoặc rõ ràng mà không làm mất thông tin: chỉ cần thay đổi kiểu/giao diện.

Mã hóa vui vẻ.