Dưới đây là trình phân tích cú pháp đơn giản mà tôi đã sử dụng khi cần thiết (thường là khi phát trực tiếp không phải là chỉ đọc và .Split thực hiện công việc), không quá tối ưu nhưng phải hoạt động tốt:
phương pháp - và nhiều hơn nữa ghi chú dưới đây)
public static IEnumerable<string> Split(this Stream stream, string delimiter, StringSplitOptions options)
{
var buffer = new char[_bufffer_len];
StringBuilder output = new StringBuilder();
int read;
using (var reader = new StreamReader(stream))
{
do
{
read = reader.ReadBlock(buffer, 0, buffer.Length);
output.Append(buffer, 0, read);
var text = output.ToString();
int id = 0, total = 0;
while ((id = text.IndexOf(delimiter, id)) >= 0)
{
var line = text.Substring(total, id - total);
id += delimiter.Length;
if (options != StringSplitOptions.RemoveEmptyEntries || line != string.Empty)
yield return line;
total = id;
}
output.Remove(0, total);
}
while (read == buffer.Length);
}
if (options != StringSplitOptions.RemoveEmptyEntries || output.Length > 0)
yield return output.ToString();
}
... và bạn chỉ có thể chuyển sang char delimiters nếu cần thiết chỉ cần thay thế
while ((id = text.IndexOf(delimiter, id)) >= 0)
... với
while ((id = text.IndexOfAny(delimiters, id)) >= 0)
(và id++
thay vì id+=
và chữ ký this Stream stream, StringSplitOptions options, params char[] delimiters
)
... cũng loại bỏ trống, vv
hy vọng nó sẽ giúp
Tại sao không sử dụng ReadLine() và sau đó tìm kiếm delimiter trong chuỗi? –
Bằng cách sử dụng 'Peek()' và 'StringBuilder', về cơ bản bạn đang nhân bản những gì' ReadLine() 'làm bên trong' StreamReader' ... do đó, nó có vẻ lạ đối với tôi đó là quá chậm; bạn có thể đăng những gì bạn đã thử không? – digEmAll
Không hiệu quả? Làm thế nào không hiệu quả? Hiệu suất có thiếu đáng kể không? –