Hier ist ein einfacher Parser ich dort eingesetzt, wo erforderlich (in der Regel, wenn Streaming nicht an erster Stelle steht nur lesen und .split macht den Job), nicht zu optimieren, aber soll funktionieren:
(es eher ein Split ist wie Verfahren - und mehr Hinweise unten)
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();
}
... und Sie können einfach wechseln Trennzeichen verkohlen, wenn die
while ((id = text.IndexOf(delimiter, id)) >= 0)
nur ersetzen benötigt ... mit
while ((id = text.IndexOfAny(delimiters, id)) >= 0)
(und id++
statt id+=
und eine Signatur this Stream stream, StringSplitOptions options, params char[] delimiters
)
... entfernt auch leer usw.
hoffen, dass es
Warum mit Readline nicht() und dann für Trennzeichen in Zeichenfolge suchen? –
Mit 'Peek()' und 'StringBuilder' replizierst du im Grunde, was' ReadLine() 'in' StreamReader' tut ... so seltsam erscheint es mir, dass es so langsam ist; kannst du posten, was du versucht hast? – digEmAll
Ineffizient? Wie ineffizient? Fehlt die Leistung spürbar? –