Saya memiliki yang berikut ini
data.AppendFormat("{0},",dataToAppend);
Masalahnya adalah saya menggunakannya dalam satu lingkaran dan akan ada koma uji coba. Apa cara terbaik untuk menghilangkan tanda koma?
Apakah saya harus mengubah data menjadi string substring itu?
c#
stringbuilder
Wesley Skeen
sumber
sumber
string.Join(",", yourCollection)
? Edit: ditambahkan sebagai jawaban.Jawaban:
Cara termudah dan paling efisien adalah dengan melakukan perintah ini:
dengan melakukan ini Anda memindahkan penunjuk (yaitu indeks terakhir) ke belakang satu karakter tetapi Anda tidak mengubah mutabilitas objek. Faktanya, membersihkan a
StringBuilder
paling baik dilakukan denganLength
juga (tetapi sebenarnya menggunakanClear()
metode untuk kejelasan sebagai gantinya karena seperti itulah implementasinya):data.Length = 0;
sekali lagi, karena tidak mengubah tabel alokasi. Anggap saja seperti mengatakan, saya tidak ingin mengenali byte ini lagi. Sekarang, bahkan saat menelepon
ToString()
, ia tidak akan mengenali apa pun yang melewatinyaLength
, yah, ia tidak bisa. Ini adalah objek yang bisa berubah yang mengalokasikan lebih banyak ruang daripada yang Anda sediakan, itu dibuat dengan cara ini.sumber
data.Length = 0;
: itulah yangStringBuilder.Clear
dilakukannya, jadi lebih baik digunakanStringBuilder.Clear
untuk kejelasan niat.Clear()
dilakukan, tapi lucu. Itulah baris pertama dariClear()
metode. Tapi, tahukah Anda bahwa antarmuka sebenarnya kemudian mengeluarkan filereturn this;
. Nah, itulah yang membunuh saya. MengaturLength = 0
perubahan referensi yang sudah Anda miliki, mengapa mengembalikan diri Anda sendiri?Append
mengembalikan dirinya sendiri juga.Gunakan saja
string.Join(",", yourCollection)
Dengan cara ini Anda tidak membutuhkan
StringBuilder
dan loop.Penambahan panjang tentang kasus asinkron. Pada 2019, bukan hal yang jarang terjadi ketika data datang secara tidak sinkron.
Jika data Anda berada dalam koleksi asinkron, tidak ada
string.Join
pengambilan berlebihanIAsyncEnumerable<T>
. Tetapi mudah untuk membuatnya secara manual, meretas kode daristring.Join
:public static class StringEx { public static async Task<string> JoinAsync<T>(string separator, IAsyncEnumerable<T> seq) { if (seq == null) throw new ArgumentNullException(nameof(seq)); await using (var en = seq.GetAsyncEnumerator()) { if (!await en.MoveNextAsync()) return string.Empty; string firstString = en.Current?.ToString(); if (!await en.MoveNextAsync()) return firstString ?? string.Empty; // Null separator and values are handled by the StringBuilder var sb = new StringBuilder(256); sb.Append(firstString); do { var currentValue = en.Current; sb.Append(separator); if (currentValue != null) sb.Append(currentValue); } while (await en.MoveNextAsync()); return sb.ToString(); } } }
Jika data datang secara asinkron tetapi antarmukanya
IAsyncEnumerable<T>
tidak didukung (seperti yang disebutkan di komentarSqlDataReader
), relatif mudah untuk menggabungkan data menjadiIAsyncEnumerable<T>
:async IAsyncEnumerable<(object first, object second, object product)> ExtractData( SqlDataReader reader) { while (await reader.ReadAsync()) yield return (reader[0], reader[1], reader[2]); }
dan gunakan itu:
Task<string> Stringify(SqlDataReader reader) => StringEx.JoinAsync( ", ", ExtractData(reader).Select(x => $"{x.first} * {x.second} = {x.product}"));
Untuk menggunakan
Select
, Anda harus menggunakan paket nugetSystem.Interactive.Async
. Di sini Anda dapat menemukan contoh kompilasi.sumber
string.Join(",", yourCollection)
masih memiliki,
akhir. jadi contoh di atasstring.Join(",", yourCollection)
tidak efisien dan tidak menghapusnya sendiri.Gunakan yang berikut ini setelah pengulangan.
.TrimEnd(',')
atau cukup ubah menjadi
string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)
sumber
string.Join(",", input)
Bagaimana dengan ini..
string str = "The quick brown fox jumps over the lazy dog,"; StringBuilder sb = new StringBuilder(str); sb.Remove(str.Length - 1, 1);
sumber
Saya lebih suka memanipulasi panjang stringbuilder:
data.Length = data.Length - 1;
sumber
data.Length--
atau--data.Length
?--
atau++
Anda dapat menggunakannyadata.Length -= 1
, atau jawaban ini juga akan berhasil.Saya sarankan, Anda mengubah algoritma loop Anda:
sumber
Anda harus menggunakan
string.Join
metode ini untuk mengubah kumpulan item menjadi string yang dipisahkan koma. Ini akan memastikan bahwa tidak ada koma di depan atau di belakang, serta memastikan string dibangun secara efisien (tanpa string perantara yang tidak perlu).sumber
Ya, ubah menjadi string setelah loop selesai:
String str = data.ToString().TrimEnd(',');
sumber
Anda punya dua pilihan. Yang pertama adalah
Remove
metode penggunaan yang sangat mudah , cukup efektif. Cara kedua adalah menggunakanToString
indeks awal dan indeks akhir ( dokumentasi MSDN )sumber
Pertanyaan SO serupa di sini.
Saya suka menggunakan metode ekstensi StringBuilder.
Metode RemoveLast
sumber
Cara paling sederhana adalah dengan menggunakan metode Join ():
public static void Trail() { var list = new List<string> { "lala", "lulu", "lele" }; var data = string.Join(",", list); }
Jika Anda benar-benar membutuhkan StringBuilder, potong koma akhir setelah pengulangan:
data.ToString().TrimEnd(',');
sumber
data.ToString().TrimEnd(',');
tidak efisienKena kau!!
Sebagian besar jawaban di utas ini tidak akan berfungsi jika Anda menggunakan
AppendLine
seperti di bawah ini:var builder = new StringBuilder(); builder.AppendLine("One,"); builder.Length--; // Won't work Console.Write(builder.ToString()); builder = new StringBuilder(); builder.AppendLine("One,"); builder.Length += -1; // Won't work Console.Write(builder.ToString()); builder = new StringBuilder(); builder.AppendLine("One,"); Console.Write(builder.TrimEnd(',')); // Won't work
Fiddle Me
MENGAPA??? @ (& ** (& @ !!
Masalahnya sederhana tapi butuh beberapa saat untuk mengetahuinya: Karena ada 2 karakter yang tidak terlihat di akhir
CR
danLF
(Carriage Return dan Line Feed). Oleh karena itu, Anda perlu menghilangkan 3 karakter terakhir:var builder = new StringBuilder(); builder.AppendLine("One,"); builder.Length -= 3; // This will work Console.WriteLine(builder.ToString());
Kesimpulannya
Gunakan
Length--
atauLength -= 1
jika metode terakhir yang Anda panggil adalahAppend
. GunakanLength =- 3
jika Anda metode terakhir yang Anda panggilAppendLine
.sumber