Misalkan saya memiliki string, misalnya,
string snip = "</li></ul>";
Saya pada dasarnya ingin menulisnya beberapa kali, tergantung pada beberapa nilai integer.
string snip = "</li></ul>";
int multiplier = 2;
// TODO: magic code to do this
// snip * multiplier = "</li></ul></li></ul>";
EDIT: Saya tahu saya dapat dengan mudah menulis fungsi saya sendiri untuk mengimplementasikan ini, saya hanya ingin tahu apakah ada operator string aneh yang tidak saya ketahui
c#
string
extension-methods
meskipun
sumber
sumber
Jawaban:
Di .NET 4 Anda dapat melakukan ini:
String.Concat(Enumerable.Repeat("Hello", 4))
sumber
operator*
diwakili oleh biner . Untuk masing-masing milik mereka, kurasa.Perhatikan bahwa jika "string" Anda hanya satu karakter, ada kelebihan konstruktor string untuk menanganinya:
int multipler = 10; string TenAs = new string ('A', multipler);
sumber
Sayangnya / untungnya, kelas string disegel sehingga Anda tidak dapat mewarisinya dan membebani operator *. Anda dapat membuat metode ekstensi:
public static string Multiply(this string source, int multiplier) { StringBuilder sb = new StringBuilder(multiplier * source.Length); for (int i = 0; i < multiplier; i++) { sb.Append(source); } return sb.ToString(); } string s = "</li></ul>".Multiply(10);
sumber
Saya bersama DrJokepu dalam hal ini , tetapi jika karena alasan tertentu Anda memang ingin menipu menggunakan fungsionalitas bawaan maka Anda dapat melakukan sesuatu seperti ini:
string snip = "</li></ul>"; int multiplier = 2; string result = string.Join(snip, new string[multiplier + 1]);
Atau, jika Anda menggunakan .NET 4:
string result = string.Concat(Enumerable.Repeat(snip, multiplier));
Secara pribadi saya tidak akan repot-repot - metode ekstensi khusus jauh lebih baik.
sumber
Hanya demi kelengkapan - berikut adalah cara lain untuk melakukan ini:
public static string Repeat(this string s, int count) { var _s = new System.Text.StringBuilder().Insert(0, s, count).ToString(); return _s; }
Saya rasa saya menariknya dari Stack Overflow beberapa waktu lalu, jadi itu bukan ide saya.
sumber
Anda harus menulis metode - tentu saja, dengan C # 3.0 ini bisa menjadi metode ekstensi:
public static string Repeat(this string, int count) { /* StringBuilder etc */ }
kemudian:
string bar = "abc"; string foo = bar.Repeat(2);
sumber
string.Join
- mengapa tidak mengulang n kali? Jauh lebih langsung.Agak terlambat (dan hanya untuk iseng), jika Anda benar-benar ingin menggunakan
*
operator untuk pekerjaan ini, Anda dapat melakukan ini:public class StringWrap { private string value; public StringWrap(string v) { this.value = v; } public static string operator *(StringWrap s, int n) { return s.value.Multiply(n); // DrJokepu extension } }
Sehingga:
var newStr = new StringWrap("TO_REPEAT") * 5;
Perhatikan bahwa, selama Anda dapat menemukan perilaku yang wajar bagi mereka, Anda juga dapat menangani operator lain melalui
StringWrap
kelas, seperti\
,^
,%
dll ...PS:
Multiply()
kredit ekstensi ke @DrJokepu semua hak dilindungi ;-)sumber
Ini jauh lebih ringkas:
new StringBuilder().Insert(0, "</li></ul>", count).ToString()
Namespace
using System.Text;
harus diimpor dalam kasus ini.sumber
string Multiply(string input, int times) { StringBuilder sb = new StringBuilder(input.length * times); for (int i = 0; i < times; i++) { sb.Append(input); } return sb.ToString(); }
sumber
Jika Anda memiliki .Net 3.5 tetapi tidak 4.0, Anda dapat menggunakan System.Linq's
String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())
sumber
String.Concat
, dan pada 3.5 Anda juga perlu.ToArray()
. Bukan solusi yang paling elegan, saya khawatir.Karena setiap orang menambahkan contoh .NET4 / Linq mereka sendiri, saya mungkin juga menambahkan contoh saya sendiri. (Pada dasarnya, ini milik DrJokepu, direduksi menjadi satu baris)
public static string Multiply(this string source, int multiplier) { return Enumerable.Range(1,multiplier) .Aggregate(new StringBuilder(multiplier*source.Length), (sb, n)=>sb.Append(source)) .ToString(); }
sumber
Oke, ini pendapat saya tentang masalah ini:
public static class ExtensionMethods { public static string Multiply(this string text, int count) { return new string(Enumerable.Repeat(text, count) .SelectMany(s => s.ToCharArray()).ToArray()); } }
Tentu saja saya agak konyol, tetapi ketika saya perlu memiliki tabulasi di kelas penghasil kode, Enumerable. Ulangi melakukannya untuk saya. Dan ya, versi StringBuilder juga baik-baik saja.
sumber
Inilah pendapat saya tentang ini hanya untuk referensi di masa mendatang:
/// <summary> /// Repeats a System.String instance by the number of times specified; /// Each copy of thisString is separated by a separator /// </summary> /// <param name="thisString"> /// The current string to be repeated /// </param> /// <param name="separator"> /// Separator in between copies of thisString /// </param> /// <param name="repeatTimes"> /// The number of times thisString is repeated</param> /// <returns> /// A repeated copy of thisString by repeatTimes times /// and separated by the separator /// </returns> public static string Repeat(this string thisString, string separator, int repeatTimes) { return string.Join(separator, ParallelEnumerable.Repeat(thisString, repeatTimes)); }
sumber
ParallelEnumerable
dalam situasi seperti ini.string.Join
perlu menggunakan elemen secara berurutan, jadi memparalelkan pembuatannya tidak beralasan.