Đây là một đoạn trích từ cuộc thảo luận trong some other question.Phân tích cú pháp mà không cần tách chuỗi
Giả sử tôi phải phân tích cú pháp một số lượng lớn các chuỗi rất dài. Mỗi chuỗi chứa một chuỗi gồm double
s (trong phần trình bày văn bản, tất nhiên) được phân tách bằng khoảng trắng. Tôi cần phải phân tích cú pháp double
s thành một số List<double>
.
Kỹ thuật phân tích cú pháp chuẩn (sử dụng string.Split
+ double.TryParse
) có vẻ khá chậm: đối với mỗi số chúng ta cần phân bổ chuỗi.
Tôi đã cố gắng làm cho nó giống như C-cách: tính toán các chỉ số bắt đầu và kết thúc của các chất nền có chứa các con số, và phân tích nó "tại chỗ", mà không tạo chuỗi bổ sung. (Xem http://ideone.com/Op6h0, dưới đây cho thấy một phần có liên quan.)
int startIdx, endIdx = 0;
while(true)
{
startIdx = endIdx;
// no find_first_not_of in C#
while (startIdx < s.Length && s[startIdx] == ' ') startIdx++;
if (startIdx == s.Length) break;
endIdx = s.IndexOf(' ', startIdx);
if (endIdx == -1) endIdx = s.Length;
// how to extract a double here?
}
Có một tình trạng quá tải của string.IndexOf
, chỉ tìm kiếm trong một chuỗi nào đó, nhưng tôi không thể tìm thấy một phương pháp để phân tích cú đúp của chuỗi con, mà không thực sự giải nén mà chuỗi con đầu tiên.
Có ai có ý tưởng không?
Các bạn đã chứng minh điều này thực sự là một nút cổ chai? Tôi không * biết * của bất kỳ cách nào để làm nó off-hand, nhưng tôi chắc chắn muốn có một số bằng chứng của nó là một vấn đề trước khi vi tối ưu hóa. –
@Jon: không thực sự. Câu hỏi được dựa trên thảo luận tại câu hỏi được liên kết (http://stackoverflow.com/questions/10053449/extract-numbers-from-string). Xin lỗi vì chuyện đó. – Vlad
Đủ công bằng. Tôi nghi ngờ rằng một thói quen phân tích cú pháp viết tay sẽ chậm hơn so với phương pháp có thể được tối ưu hóa với rất nhiều kinh nghiệm mà nhóm BCL đã đưa ra :) –