Saya mencoba untuk memasukkan sejumlah lekukan sebelum string berdasarkan kedalaman item dan saya bertanya-tanya apakah ada cara untuk mengembalikan string yang diulang X kali. Contoh:
string indent = "---";
Console.WriteLine(indent.Repeat(0)); //would print nothing.
Console.WriteLine(indent.Repeat(1)); //would print "---".
Console.WriteLine(indent.Repeat(2)); //would print "------".
Console.WriteLine(indent.Repeat(3)); //would print "---------".
String
kelas yang kelebihan tidak mengambil string sebagai parameter untuk membuat pengulangan dari itu yang bisa membuat jawaban yang diterima cocok.Jawaban:
Jika Anda hanya ingin mengulang karakter yang sama, Anda dapat menggunakan konstruktor string yang menerima karakter dan berapa kali mengulanginya
new String(char c, int count)
.Misalnya, untuk mengulangi tanda hubung lima kali:
sumber
Jika Anda menggunakan .NET 4.0, Anda bisa menggunakannya
string.Concat
bersamaEnumerable.Repeat
.Kalau tidak, aku akan pergi dengan sesuatu seperti jawaban Adam .
Alasan saya umumnya tidak menyarankan menggunakan jawaban Andrey adalah karena
ToArray()
panggilan itu memperkenalkan overhead berlebihan yang dihindari denganStringBuilder
pendekatan yang disarankan oleh Adam. Yang mengatakan, setidaknya itu berfungsi tanpa memerlukan. NET 4.0; dan itu cepat dan mudah (dan tidak akan membunuh Anda jika efisiensi tidak terlalu menjadi perhatian).sumber
Console.WriteLine(string.Concat("-", string.Concat(Enumerable.Repeat(indent, N))));
sumber
input.Length * count
keStringBuilder
konstruktor, bukan begitu?input.Length * count
keStringBuilder
konstruktor, Anda dapat melewatiStringBuilder
semuanya dan membuat char [] dengan ukuran yang tepat segera.StringBuilder
, dan kode akan kurang transparan.solusi paling performan untuk string
sumber
Untuk banyak skenario, ini mungkin solusi yang paling rapi:
Maka penggunaan adalah:
Ini didasarkan pada jawaban lain (khususnya @ c0rd). Serta kesederhanaan, ia memiliki fitur berikut, yang tidak semua teknik lain yang dibagikan berbagi:
StringBuilder
melalui preallokasi penyimpanan.sumber
Gunakan String.PadLeft , jika string yang Anda inginkan hanya berisi satu karakter.
Kredit jatuh tempo di sini
sumber
string
konstruktor yang mengambilchar
danint
?String.PadLeft
argumen dibalik. Itucount
datang sebelum karakter padding.Anda dapat mengulangi string Anda (kalau-kalau itu bukan char tunggal) dan menyetujui hasilnya, seperti ini:
sumber
Saya akan mencari jawaban Dan Tao, tetapi jika Anda tidak menggunakan .NET 4.0 Anda dapat melakukan sesuatu seperti itu:
sumber
sumber
Saya suka jawaban yang diberikan. Meskipun demikian, di sepanjang garis sames itulah yang saya gunakan di masa lalu:
"" .PadLeft (3 * Indent, '-')
Ini akan memenuhi pembuatan indentasi tetapi secara teknis pertanyaannya adalah mengulang sebuah string. Jika indentasi string adalah sesuatu seperti> - <maka ini juga jawaban yang diterima tidak akan berfungsi. Dalam hal ini solusi c0rd menggunakan stringbuilder terlihat bagus, meskipun overhead dari stringbuilder mungkin sebenarnya tidak membuatnya menjadi yang paling performant. Salah satu pilihan adalah membangun sebuah array string, mengisinya dengan string indentasi, lalu menyatukannya. Untuk sedikit pun:
Kita semua menyukai solusi yang cerdas tetapi terkadang sederhana adalah yang terbaik.
sumber
Menambahkan Metode Ekstensi yang saya gunakan di seluruh proyek saya:
Semoga seseorang dapat menggunakannya ...
sumber
Terkejut tidak ada yang pergi sekolah tua. Saya tidak membuat klaim apa pun tentang kode ini, tetapi hanya untuk bersenang-senang:
sumber
Tidak yakin bagaimana ini akan melakukan, tetapi itu adalah potongan kode yang mudah. (Saya mungkin membuatnya tampak lebih rumit daripada itu.)
Atau, jika Anda tahu jumlah level maksimum yang dapat Anda harapkan, Anda bisa mendeklarasikan array dan mengindeksnya. Anda mungkin ingin membuat array ini statis atau konstan.
sumber
Saya tidak punya cukup perwakilan untuk mengomentari jawaban Adam, tetapi cara terbaik untuk melakukannya adalah seperti ini:
Anda harus memeriksa untuk melihat apakah numTimes lebih besar dari nol, jika tidak, Anda akan mendapatkan pengecualian.
sumber
Saya tidak melihat solusi ini. Saya merasa lebih mudah untuk keberadaan saya saat ini dalam pengembangan perangkat lunak:
sumber
Untuk penggunaan umum, solusi yang melibatkan kelas StringBuilder adalah yang terbaik untuk mengulang string multi-karakter. Ini dioptimalkan untuk menangani kombinasi sejumlah besar string dengan cara yang tidak dapat digabungkan dengan sederhana dan akan sulit atau tidak mungkin dilakukan secara lebih efisien dengan tangan. Solusi StringBuilder yang ditampilkan di sini menggunakan iterasi O (N) untuk menyelesaikan, laju rata yang proporsional dengan berapa kali itu diulang.
Namun, untuk jumlah pengulangan yang sangat besar, atau di mana tingkat efisiensi yang tinggi harus ditekan, pendekatan yang lebih baik adalah melakukan sesuatu yang mirip dengan fungsi dasar StringBuilder tetapi untuk menghasilkan salinan tambahan dari tujuan, daripada dari string asli, seperti di bawah ini.
Ini menggandakan panjang string sumber / tujuan dengan setiap iterasi, yang menghemat overhead pengaturan ulang penghitung setiap kali akan melewati string asli, alih-alih membaca dengan lancar dan menyalin string yang sekarang jauh lebih lama, sesuatu yang prosesor modern dapat lakukan banyak lebih efisien.
Ia menggunakan basis-2 logaritma untuk menemukan berapa kali perlu menggandakan panjang string dan kemudian mulai melakukannya berkali-kali. Karena sisa yang akan disalin sekarang kurang dari total panjangnya menyalin, maka kemudian hanya dapat menyalin subset dari apa yang telah dihasilkan.
Saya telah menggunakan metode Array.Copy () atas penggunaan StringBuilder, karena menyalin isi dari StringBuilder ke dalam dirinya sendiri akan memiliki overhead menghasilkan string baru dengan konten itu dengan setiap iterasi. Array.Copy () menghindari ini, sambil tetap beroperasi dengan tingkat efisiensi yang sangat tinggi.
Solusi ini mengambil iterasi O (1 + log N) untuk menyelesaikan, tingkat yang meningkat secara logaritmik dengan jumlah pengulangan (menggandakan jumlah pengulangan sama dengan satu iterasi tambahan), penghematan yang substansial dibandingkan metode lain, yang meningkat secara proporsional.
sumber
Pendekatan lain adalah untuk mempertimbangkan
string
sebagaiIEnumerable<char>
dan memiliki metode ekstensi generik yang akan memperbanyak item dalam koleksi dengan faktor tertentu.Jadi dalam kasus Anda:
sumber
Cetak garis dengan pengulangan.
sumber
Anda dapat membuat ExtensionMethod untuk melakukannya!
Atau menggunakan solusi @Dan Tao:
sumber