下面是我用一个简单的解析器在需要的地方(通常,如果流不是最重要的,仅读和.Split做这项工作),没有太多优化,但应该很好地工作:
(它更像一个斯普利特方法 - 并在下面更笔记)
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();
}
...你可以简单地切换到char分隔符如果需要的话只需更换
while ((id = text.IndexOf(delimiter, id)) >= 0)
...与
while ((id = text.IndexOfAny(delimiters, id)) >= 0)
(和id++
而不是id+=
和签名this Stream stream, StringSplitOptions options, params char[] delimiters
)
...还删除空等
希望它有助于
为什么不使用的ReadLine(),然后搜索字符串分隔符? – 2012-03-26 13:43:49
通过使用'皮克()'和'StringBuilder'你基本上是在重复'的ReadLine()'做'里面...... StreamReader'如此看来奇怪,我是如此缓慢;你可以发布你已经尝试过吗? – digEmAll 2012-03-26 13:46:06
效率低下?效率如何?表现不明显? – 2012-03-26 13:48:12