下面是我用一個簡單的解析器在需要的地方(通常,如果流不是最重要的,僅讀和.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