Pembaruan: Lihat di sini untuk solusi alternatif / async.
Ini berfungsi dengan baik dan lebih cepat daripada Regex:
input.Split(new[] {"\r\n", "\r", "\n"}, StringSplitOptions.None)
Penting untuk memiliki yang "\r\n"
pertama dalam array sehingga diambil sebagai satu baris. Di atas memberikan hasil yang sama dengan salah satu dari solusi Regex ini:
Regex.Split(input, "\r\n|\r|\n")
Regex.Split(input, "\r?\n|\r")
Kecuali bahwa Regex ternyata sekitar 10 kali lebih lambat. Inilah tes saya:
Action<Action> measure = (Action func) => {
var start = DateTime.Now;
for (int i = 0; i < 100000; i++) {
func();
}
var duration = DateTime.Now - start;
Console.WriteLine(duration);
};
var input = "";
for (int i = 0; i < 100; i++)
{
input += "1 \r2\r\n3\n4\n\r5 \r\n\r\n 6\r7\r 8\r\n";
}
measure(() =>
input.Split(new[] {"\r\n", "\r", "\n"}, StringSplitOptions.None)
);
measure(() =>
Regex.Split(input, "\r\n|\r|\n")
);
measure(() =>
Regex.Split(input, "\r?\n|\r")
);
Keluaran:
00:00: 03.8527616
00:00: 31.8017726
00:00: 32.5557128
dan inilah Metode Extension:
public static class StringExtensionMethods
{
public static IEnumerable<string> GetLines(this string str, bool removeEmptyLines = false)
{
return str.Split(new[] { "\r\n", "\r", "\n" },
removeEmptyLines ? StringSplitOptions.RemoveEmptyEntries : StringSplitOptions.None);
}
}
Pemakaian:
input.GetLines() // keeps empty lines
input.GetLines(true) // removes empty lines