2011-02-08 8 views
5

Tôi có phương pháp dưới đây, nơi tôi cần phải kiểm tra một số chuỗi nhất định có thể trong bất kỳ trường hợp nào và sau đó xóa chúng. Chỉ cần tự hỏi nếu có một cách thực hiện tốt hơn?Ngoài sự tò mò - có cách tiếp cận thực hiện tốt hơn để thực hiện chuỗi này thay thế không?

private void MyMethod(string Filter) 
{ 
    //need to remove <Filter> and </Filter> case in-sensitive 
    var result = Filter.ToLower().Replace("<filter>",""); 
    result = Filter.ToLower().Replace("</filter>,""); 

    ........................... 
} 
+1

'Regex.Replace (Bộ lọc," ", string.empty, RegexOptions.IgnoreCase); 'Nếu bạn quan tâm đến hiệu suất của các phương pháp khác nhau, có rất nhiều cuộc thảo luận về nó ở đây trên SO. –

+3

không phải là nó sẽ thay đổi trường hợp của những gì ở giữa các thẻ. hoặc nó không quan trọng với bạn. –

+3

'ToUpper' là một lựa chọn tốt hơn so với' ToLower'. So sánh và thay thế chuỗi đã được tối ưu hóa cho trước đây. Từ quan điểm của nhà phát triển, không có sự khác biệt vì vậy nó là một sửa chữa đơn giản. –

Trả lời

3

Một vấn đề với cách tiếp cận đó là nó sẽ biến toàn bộ chuỗi thành chữ thường, không chỉ làm cho một trường hợp không bị thay thế.

Bạn có thể sử dụng một biểu thức chính quy để làm một trường hợp insensetive trận đấu:

string result = Regex.Replace(
    Filter, 
    "</?filter>", 
    String.Empty, 
    RegexOptions.IgnoreCase 
); 

Một lựa chọn khác là sử dụng phương pháp IndexOf để xác định vị trí các dây, vì nó có thể làm một trường hợp tìm kiếm insensetive:

string result = Filter; 
int index; 
while ((index = IndexOf("<filter>", StringComparison.OrdinalIgnoreCase)) != -1) { 
    result = result.Remove(index, 8); 
} 
while ((index = IndexOf("</filter>", StringComparison.OrdinalIgnoreCase)) != -1) { 
    result = result.Remove(index, 9); 
} 
1

Replace gọi tới mã không được quản lý được triển khai bằng C++ mà tôi cho là khó đánh bại.

Tuy nhiên, tôi có thể thấy bạn tiếp tục sử dụng .ToLower() mà bạn có thể cắt giảm xuống một cuộc gọi và giữ chuỗi.

+0

Tôi nghĩ rằng công cụ ToLower() có thể là một vấn đề. Ngoài ra, chuỗi đầu ra bây giờ là chữ thường. –

+0

Có, tôi chỉ cần gõ các từ :) – Aliostad

+0

Tôi nghi ngờ điều này (bit mã không được quản lý) rất nhiều. –

4

Kiểm tra câu trả lời này: Is there an alternative to string.Replace that is case-insensitive?

Bạn có thể muốn so sánh với kiểm tra hiệu suất. Hồ sơ này với một hồ sơ. Đó là cách duy nhất để thực sự biết, những gì là nhanh hơn.

Nhưng thành thực: Hiệu suất có thực sự quan trọng không? Bạn có thường xuyên làm việc này không? Tôi thực sự không thể thấy bạn thực hiện việc này thường xuyên như vậy, hiệu suất đó sẽ trở thành vấn đề ...

Bạn có thể thử Regex.Replace, với sự thay thế không phân biệt chữ hoa chữ thường. Đây không phải là nhanh hơn. Nhưng nó không phân biệt chữ hoa chữ thường.

+0

Tại sao bạn nghĩ rằng một regex sẽ nhanh hơn? Và nếu không, tại sao bạn khuyên bạn nên thử thay vào đó? –

+0

Tôi không nghĩ rằng anh ta khẳng định rằng 'Regex.Replace' là nhanh hơn, hoàn toàn ngược lại. –

+0

Không, tôi không nghĩ Regex.Replace nhanh hơn. Nhưng nó làm một trường hợp không nhạy cảm thay thế. Tôi sẽ cập nhật câu trả lời của mình. –

1

Trong mọi trường hợp, bạn sắp xếp chuỗi gốc ở đây thấp hơn, đây có thể không phải là điều tốt?

+0

Các ý kiến ​​trong mã chỉ ra rằng ý định là để thực hiện một sự thay thế không phân biệt chữ hoa chữ thường. Tôi cho rằng đó là lý do tại sao chuỗi được chuyển đổi thành chữ thường. –

+1

@Cody Grey - Điều đó đúng, nhưng vấn đề ở đây là phần của chuỗi không được thay thế, nó cũng được chuyển đổi thành tất cả các chữ thường. Tôi nghĩ đó là mối quan tâm của bjornars ở đây. (ngay cả khi đây là một bình luận nhiều hơn một câu trả lời thực sự) –

0

Nếu mã được cung cấp làm việc cho bạn, hơn thế này sẽ nhanh hơn:

private void MyMethod(string Filter) 
{ 
    //need to remove <Filter> and </Filter> case in-sensitive 
    var result = Filter.ToLower().Replace("</filter>",""); 

    ........................... 
} 

kết quả báo cáo kết quả đầu tiên được bỏ qua.

+0

Bạn đang thiếu một dấu ngoặc kép đóng. Ngoài ra, điều này không tạo ra kết quả tương tự. Nó chỉ loại bỏ một trong các bước. Về cơ bản, mã của bạn không làm những gì bình luận ở trên nó nói. – David

+0

Đúng, nhưng nó thực hiện giống như mã được cung cấp, nhưng nhanh hơn, vì cả hai thay thế được thực hiện trên 'Filter.ToLower()'. – Excel20

+0

Tôi gặp khó khăn khi không upvoting cái này. Tôi không nên và sẽ không. Nhưng bạn làm tôi mỉm cười :) –

1

Nó phụ thuộc vào một vài điều, chuỗi Bộ lọc là bao lâu, vv ..
Vì vậy, bạn sẽ phải đo lường.

Nhưng tôi mong đợi một (đơn!) RegEx sẽ nhanh hơn ở đây.

+0

Điều gì sẽ xảy ra nếu bạn có 50 chuỗi để thay thế tại đây vì một số lý do. Won 'tthe RegEx là lộn xộn đáng kinh ngạc? –

+0

@Oyvind: Sẽ rất nhanh, càng nhiều càng tốt. –

+0

Tôi không đề cập đến tốc độ, nhưng khả năng đọc của mã. Bất kỳ cách nào để làm cho cái nhìn đó thậm chí từ xa tốt? (Tôi không phải bây giờ RegEx, đó là lý do tại sao tôi yêu cầu;)) –