Apa itu cara terbaik untuk menghasilkan string \t
's di C #
Saya belajar C # dan bereksperimen dengan berbagai cara untuk mengatakan hal yang sama.
Tabs(uint t)
adalah fungsi yang mengembalikan sebuah string
dengan t
jumlah \t
's
Misalnya Tabs(3)
pengembalian"\t\t\t"
Manakah dari tiga cara penerapan Tabs(uint numTabs)
ini yang terbaik?
Tentu saja itu tergantung pada apa artinya "terbaik".
Versi LINQ hanya dua baris, yang bagus. Tetapi apakah panggilan untuk Berulang dan Agregat yang tidak perlu menghabiskan waktu / sumber daya?
The
StringBuilder
Versi ini sangat jelas, tetapi adalahStringBuilder
kelas entah bagaimana lebih lambat?The
string
versi dasar, yang berarti mudah dimengerti.Tidak masalah sama sekali? Apakah mereka semua sama?
Ini semua pertanyaan untuk membantu saya merasakan C # yang lebih baik.
private string Tabs(uint numTabs)
{
IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : "";
}
private string Tabs(uint numTabs)
{
StringBuilder sb = new StringBuilder();
for (uint i = 0; i < numTabs; i++)
sb.Append("\t");
return sb.ToString();
}
private string Tabs(uint numTabs)
{
string output = "";
for (uint i = 0; i < numTabs; i++)
{
output += '\t';
}
return output;
}
Kembali
Dan
Kembali
dari...
Apakah ada fungsi bawaan untuk mengulang string atau char di .net?
sumber
StruingBuilder
!string.Join
lebih cepat dalam contoh karena mereka menggunakan pembatas ruang.string.Concat
sesuai ketika tidak ada pembatas.Di semua versi .NET, Anda dapat mengulangi string dengan demikian:
Untuk mengulangi karakter,
new String('\t', count)
adalah taruhan terbaik Anda. Lihat jawabannya oleh @CMS .sumber
Versi terbaik tentu menggunakan cara bawaan:
Dari solusi lain, lebih suka yang termudah; hanya jika ini terbukti terlalu lambat, upayakan solusi yang lebih efisien.
Jika Anda menggunakan aOmong kosong: tentu saja kode di atas lebih efisien.StringBuilder
dan mengetahui panjangnya yang dihasilkan sebelumnya, kemudian juga menggunakan konstruktor yang sesuai, ini jauh lebih efisien karena itu berarti hanya satu alokasi waktu yang memakan waktu, dan tidak perlu menyalin data.sumber
new string('\t', len)
antara 2x dan 7x lebih cepat dariStringBuilder
pendekatan. Menurut Anda mengapaStringBuilder
lebih efisien dalam hal ini?Metode ekstensi:
sumber
Enumerable.Range(0, n).SelectMany(x => s)
bisa diganti dengan yang sederhanaEnumerable.Repeat(s, n)
.SelectMany
kehendak untuk setiap boneka tunggalx
memberikan urutanchar
nilai (sejakstring s
alatIEnumerable<char>
), dan semua orangchar
urutan yang bersambung ke satu panjangchar
berurutan. Apa yang Anda sarankan sebagai gantinya akan memberikanIEnumerable<string>
. Itu tidak sama.Enumerable.Repeat
, saya harus menggabungkan string bersama-sama:string.Concat(Enumerable.Repeat(s, n))
. Ini sudah diposting sebelumnya .Bagaimana dengan menggunakan metode ekstensi?
Anda kemudian dapat menulis:
Perhatikan bahwa tes kinerja menggunakan versi stringbuilder untuk karakter sederhana alih-alih string memberi Anda hukuman dalm kinerja utama: di komputer saya perbedaan dalam kinerja yang dipalsukan adalah 1:20 antara: Debug.WriteLine ('-'. Ulangi (1000000)) // versi char dan
Debug.WriteLine ("-". Ulangi (1000000)) // versi string
sumber
StringBuilder.Insert(Int32, String, Int32)
, seperti yang dijawab Binoj Anthony .Bagaimana dengan ini:
sumber
new string('\t', 10)
solusi terbaikSaya tahu bahwa pertanyaan ini sudah berusia lima tahun tetapi ada cara sederhana untuk mengulangi string yang bahkan berfungsi di .Net 2.0.
Untuk mengulang string:
Kembali
Untuk mengulang string sebagai array:
Kembali
Tetap sederhana.
sumber
Katakanlah Anda ingin mengulangi '\ t' n beberapa kali, Anda dapat menggunakan;
sumber
Contoh pertama Anda yang menggunakan
Enumerable.Repeat
:dapat ditulis ulang dengan lebih kompak dengan
String.Concat
:sumber
Menggunakan
String.Concat
danEnumerable.Repeat
mana yang akan lebih murah daripada menggunakanString.Join
sumber
sumber
Jawabannya sangat tergantung pada kompleksitas yang Anda inginkan. Misalnya, saya ingin menguraikan semua indentasi saya dengan bilah vertikal, jadi string indentasi saya ditentukan sebagai berikut:
sumber
Namun metode lain
sumber
StringBuilder
konstruktor menyimpan realokasi. Namun, ini lebih cerewet dan kurang efisien daripada menggunakanstring
konstruktor yang dapat mengulangi karakter yang diberikan, seperti yang sudah ditunjukkan dalam jawaban yang diterima.Bagi saya tidak masalah:
sumber
Anda dapat membuat metode ekstensi
Maka Anda bisa menggunakannya seperti ini
sumber
Tanpa ragu jawaban yang diterima adalah cara terbaik dan tercepat untuk mengulang satu karakter.
Jawaban Binoj Anthony adalah cara yang sederhana dan cukup efisien untuk mengulang sebuah string.
Namun, jika Anda tidak keberatan sedikit kode lagi, Anda dapat menggunakan teknik isi array saya untuk secara efisien membuat string ini lebih cepat. Dalam tes perbandingan saya, kode di bawah ini dijalankan sekitar 35% dari waktu kode StringBuilder.Insert.
Untuk lebih lanjut tentang teknik pengisian array ini, lihat Cara tercepat untuk mengisi array dengan nilai tunggal
sumber
Coba ini:
sumber
Meskipun sangat mirip dengan saran sebelumnya, saya ingin membuatnya tetap sederhana dan menerapkan yang berikut:
Standar. Net,
sumber