Bagaimana Anda membagi string multi-baris menjadi garis?
Saya tahu cara ini
var result = input.Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
terlihat agak jelek dan kehilangan garis kosong. Apakah ada solusi yang lebih baik?
Jawaban:
Jika terlihat jelek, hapus saja
ToCharArray
panggilan yang tidak perlu .Jika Anda ingin membagi dengan salah satu
\n
atau\r
, Anda punya dua opsi:Gunakan array literal - tetapi ini akan memberi Anda baris kosong untuk akhiran bergaya Windows
\r\n
:Gunakan ekspresi reguler, seperti yang ditunjukkan oleh Bart:
Jika Anda ingin mempertahankan baris kosong, mengapa Anda secara eksplisit meminta C # untuk membuangnya? (
StringSplitOptions
parameter) - gunakanStringSplitOptions.None
saja.sumber
Environment.NewLine
adalah jalan keluar sejauh yang saya ketahui. Bahkan, dari semua solusi yang mungkin saya lebih suka yang menggunakan ekspresi reguler karena hanya itu yang menangani semua platform sumber dengan benar.StringSplitOptions.RemoveEmptyEntries
.sumber
string.Split
atauRegex.Split
)?Pembaruan: Lihat di sini untuk solusi alternatif / async.
Ini berfungsi dengan baik dan lebih cepat daripada Regex:
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:Kecuali bahwa Regex ternyata sekitar 10 kali lebih lambat. Inilah tes saya:
Keluaran:
00:00: 03.8527616
00:00: 31.8017726
00:00: 32.5557128
dan inilah Metode Extension:
Pemakaian:
sumber
[\r\n]{1,2}
\n\r
atau\n\n
sebagai pemecah baris tunggal yang tidak benar.Hello\n\nworld\n\n
kasus tepi? Itu jelas satu baris dengan teks, diikuti oleh baris kosong, diikuti oleh baris lain dengan teks, diikuti oleh baris kosong.Anda bisa menggunakan Regex. Letakkan:
Sunting: ditambahkan
|\r
ke akun untuk terminator garis Mac (lama).sumber
\r
sebagai akhir baris.Jika Anda ingin menjaga baris kosong cukup hapus StringSplitOptions.
sumber
Saya punya jawaban lain ini tetapi yang ini, berdasarkan jawaban Jack ,
secara signifikan lebih cepatmungkin lebih disukai karena ia bekerja secara serempak, walaupun sedikit lebih lambat.Pemakaian:
Uji:
Keluaran:
00:00: 03.9603894
00.00: 00.0029996
00:00: 04.8221971
sumber
sumber
Sedikit terpelintir, tetapi blok iterator untuk melakukannya:
Anda kemudian dapat menelepon:
sumber
sumber
Sangat sulit untuk menangani ujung garis campuran dengan benar. Seperti kita ketahui, karakter garis terminasi dapat "Pakan Line" (ASCII 10,
\n
,\x0A
,\u000A
), "Carriage Return" (ASCII 13,\r
,\x0D
,\u000D
), atau beberapa kombinasi dari mereka. Kembali ke DOS, Windows menggunakan urutan dua karakter CR-LF\u000D\u000A
, jadi kombinasi ini hanya akan memancarkan satu baris. Unix menggunakan satu\u000A
, dan sangat lama Mac menggunakan satu\u000D
karakter. Cara standar untuk memperlakukan campuran karakter ini secara acak dalam satu file teks adalah sebagai berikut:\u000D\u000A
) maka keduanya bersama - sama hanya melewati satu baris.String.Empty
adalah satu-satunya input yang tidak menghasilkan baris (karakter apa pun memerlukan setidaknya satu baris)Aturan sebelumnya menjelaskan perilaku StringReader.ReadLine dan fungsi terkait, dan fungsi yang ditunjukkan di bawah ini menghasilkan hasil yang identik. Ini adalah fungsi melanggar garis C # yang efisien yang dengan patuh mengimplementasikan pedoman ini untuk menangani urutan atau kombinasi arbitrer / CR / LF yang sewenang-wenang. Baris yang disebutkan tidak mengandung karakter CR / LF. Baris kosong dipertahankan dan dikembalikan sebagai
String.Empty
.Catatan: Jika Anda tidak keberatan overhead menciptakan
StringReader
instance pada setiap panggilan, Anda dapat menggunakan kode C # 7 berikut . Seperti disebutkan, sementara contoh di atas mungkin sedikit lebih efisien, kedua fungsi ini menghasilkan hasil yang sama persis.sumber