2010-07-11 22 views
131

Giả sử chúng ta có chuỗi sauCách nhanh nhất để loại bỏ char đầu tiên trong một chuỗi

string data= "/temp string"; 

Nếu chúng ta muốn loại bỏ các ký tự đầu tiên / chúng ta có thể làm bằng rất nhiều cách khác nhau như:

data.Remove(0,1); 
data.TrimStart('/'); 
data.Substring(1); 

Nhưng .. thực sự tôi không biết cái nào có thuật toán tốt nhất và làm nhanh hơn ..
Có cái nào tốt nhất hay tất cả đều giống nhau không?

+0

Bạn có muốn xóa ký tự đầu tiên không hoặc bạn có cần kiểm tra xem ký tự này thực sự là một '/' không? – SRKX

+2

'TrimStart' sẽ không loại bỏ char đầu tiên, nó sẽ xóa' n' ký tự ngay từ đầu. 'Chuỗi con' là nhanh nhất. –

+0

tôi chỉ cần loại bỏ bất kỳ ký tự đầu tiên –

Trả lời

101

Tùy chọn thứ hai thực sự không giống với các tùy chọn khác - nếu chuỗi là "/// foo", nó sẽ trở thành "foo" thay vì "// foo".

Tùy chọn đầu tiên cần thêm một chút công việc để hiểu hơn thứ ba - tôi sẽ xem tùy chọn Substring là tùy chọn phổ biến nhất và có thể đọc được.

(Rõ ràng mỗi người trong số họ như một tuyên bố cá nhân sẽ không làm bất cứ điều gì hữu ích - bạn sẽ cần phải gán kết quả cho một biến, có thể data chính nó.)

tôi sẽ không mất hiệu suất cân nhắc ở đây trừ khi nó thực sự trở thành vấn đề cho bạn - trong trường hợp đó, cách duy nhất bạn biết là có các trường hợp thử nghiệm và sau đó dễ dàng chạy các trường hợp thử nghiệm đó cho mỗi tùy chọn và so sánh kết quả. Tôi mong đợi Substring có thể là nhanh nhất ở đây, đơn giản bởi vì Substring luôn kết thúc bằng việc tạo chuỗi từ một đoạn duy nhất của đầu vào gốc, trong khi Remove phải ít nhất có khả năng dán cùng một đoạn bắt đầu và đoạn cuối.

+26

tôi kiểm tra bây giờ bằng cách gọi mỗi người khoảng 90.000.000 và tôi đi theo kết quả sau: Remove: 06,63 - TrimStart: 04,71 - chuỗi con: 03,09 như vậy từ kết quả chuỗi con là tốt nhất –

+2

Chỉ cần nhớ rằng khi bạn đang thử nghiệm hiệu suất theo cách này, bạn bị ảnh hưởng bởi bộ nhớ đệm CPU, vì vậy bạn cần phải làm điều đó trên các chuỗi ngẫu nhiên, rằng bạn đã điền trước một mảng (danh sách) với, và chọn ngẫu nhiên phần tử của mảng đó (danh sách). – ajeh

5

Bạn có thể cấu hình nó, nếu bạn thực sự quan tâm. Viết một vòng lặp của nhiều lần lặp lại và xem điều gì xảy ra. Rất có thể, tuy nhiên, đây không phải là nút cổ chai trong ứng dụng của bạn, và TrimStart có vẻ là ngữ nghĩa chính xác nhất. Cố gắng viết mã dễ đọc trước khi tối ưu hóa.

+6

'TrimStart' là ít nhất là chính xác, vì' "// chuỗi temp" .TrimStart ('/') 'sẽ * không * chỉ cần xoá' '/' 'đầu tiên. –

+0

Chức năng này được đặt tên kém. Tôi không phải là anh chàng C#. –

+0

@StefanKendall: Nhìn vào các thẻ –

8

Tôi đoán rằng RemoveSubstring sẽ buộc cho vị trí đầu tiên, kể từ khi họ vừa thu thập được một phần cố định kích thước của chuỗi, trong khi TrimStart hiện một quét từ bên trái với một thử nghiệm trên mỗi nhân vật và sau đó phải thực hiện chính xác công việc giống như hai phương thức khác. Nghiêm túc, tuy nhiên, điều này là tách lông.

+1

Thực ra, 'Chuỗi con' nhanh hơn' Remove', vì 'Remove' gọi' Chuỗi con'. –

+0

@Jaroslav: Điều này không đúng. Cả hai 'Substring' và' Remove' đều dựa vào một phương thức riêng, 'FillSubstring'. –

+0

Đã không xác minh nó, nhưng nó rất có vẻ hợp lý: 'string Remove (nguồn chuỗi này, int from, int to) {return source.SubString (0, from) + source.SubString (to); } ' – Dykam

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