2013-07-31 31 views
5

Joe Duffy's Blog ngụ ý sử dụng string.Substring hiệu quả hơn string.Split.String.Substring hiệu quả hơn String.Split như thế nào?

Tôi không biết liệu phương pháp Substring không phân bổ một chuỗi mới hay nó chỉ hiệu quả hơn vì nó không tạo ra phân bổ không cần thiết. Bạn có thể vui lòng giải thích cách nó hiệu quả hơn và hiển thị một ví dụ.

Tôi hiểu ví dụ đầu tiên của anh ấy khi tạo mảng và sau đó xử lý từng chuỗi trong mảng.

string str = ...; 
string[] substrs = str.Split(','); 
foreach (string subtr in substrs) { 
Process(substr); 
} 

Làm thế nào là hiệu quả hơn sau

string str = ...; 
int lastIndex = 0; 
int commaIndex; 
while ((commaIndex = str.IndexOf(',', commaIndex)) != -1) { 
    Process(substr, lastIndex, commaIndex); 
    lastIndex = commaIndex + 1; 

Những gì tôi thấy đang sử dụng String.IndexOf để tìm ra chỉ số của dấu phẩy sau đó xử lý chuỗi. Tôi cho rằng anh ta định sử dụng String.Substring để trích xuất dữ liệu trong quá trình xử lý của mình. Một trong những ý kiến ​​dưới đây cho thấy anh ta có thể kéo nhân vật theo nhân vật. Liệu anh ta có kéo nhân vật cho đến khi anh ta chạm vào dấu phẩy tiếp theo có thể xây dựng một mảng char?

+0

Có sting.Index được sử dụng để tìm chỉ mục dấu phẩy nhưng bên trong phương thức xử lý giả thuyết của bạn, bạn vẫn cần phải tạo chuỗi con để trích xuất dữ liệu trong các chỉ mục đó. đúng? –

+0

Tôi đã sửa chữa - ví dụ thực sự gây nhầm lẫn – BrokenGlass

+0

"Có các API bom mìn ẩn chứa ở đó, như String.Split và String.Substring" ngụ ý rằng anh ta nghĩ 'Chuỗi con không hiệu quả. Và tôi nghĩ rằng "String có, sau khi tất cả, có một chỉ mục. Và nó an toàn kiểu! Vì vậy, tại chỗ phân tích ít nhất sẽ không dẫn đến tràn bộ đệm" ngụ ý anh ta dự định bạn truy cập ký tự chuỗi con theo ký tự, thay vì bằng cách sử dụng 'Chuỗi con'. – Blorgbeard

Trả lời

7

Tốt đau buồn.

Trò đùa cũ: Người quản lý muốn biết liệu lập trình viên A hay lập trình viên B có phải là lập trình viên tốt hơn không, do đó anh ấy đã tổ chức một cuộc thi. Cả hai đều viết một chương trình để giải quyết một vấn đề phức tạp nhất định, và người viết chương trình tốt nhất sẽ thắng.

Hai lập trình viên đã gửi câu trả lời của họ. Chương trình của lập trình viên chạy nhanh nhất, và người quản lý sắp tuyên bố anh ta là người chiến thắng khi lập trình viên B chỉ ra rằng câu trả lời được cung cấp bởi chương trình lập trình viên A là một chút.

"Nhưng chương trình của tôi vẫn nhanh nhất, tôi xứng đáng để giành chiến thắng là", cho biết lập trình A.

"Nếu câu trả lời không phải là đúng, tôi có thể viết một chương trình mà là nhanh hơn so với bạn 10 lần ", lập trình viên được trả lại B.

Ví dụ thứ hai của Joe Duffy, nơi anh tránh sử dụng string.Split(), là sai. Nó sẽ không biên dịch. Biến "substr" là không xác định.

Tôi nghỉ lại trường hợp của mình.

+0

trò đùa hay, :), tôi thích nó. – David

+1

Trò đùa hay, nhưng tôi không chắc điểm của bạn là gì. Sai lầm của Joe Duffy là một lỗi đánh máy đơn giản - anh ta muốn nói "str" ​​thay vì "substr". – Blorgbeard

+4

@Blorgbeard: Rằng anh vô tình phá vỡ các ổ đĩa mã kinda nhà điểm, mặc dù. Bạn càng làm phức tạp nhiều thứ, càng có nhiều khả năng những thứ như vậy sẽ leo lên. Đặc biệt nếu bạn đang tăng độ phức tạp. Không giúp ích cho trường hợp của anh ta chỉ là lỗi đánh máy; đó là bằng chứng cho thấy anh không bận tâm để kiểm tra hoặc lập hồ sơ mã trước khi anh bắt đầu ranting về chất nền. Trên thực tế gõ nó trong VS và biên dịch nó sẽ tiết lộ lỗi. – cHao

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