我可以“乘”一个string(在C#中)?

假设我有一个string,例如,

string snip = "</li></ul>"; 

我想基本上写多次,这取决于一些整数值。

 string snip = "</li></ul>"; int multiplier = 2; // TODO: magic code to do this // snip * multiplier = "</li></ul></li></ul>"; 

编辑:我知道我可以很容易地写我自己的函数来实现这一点,我只是想知道是否有一些奇怪的string运算符,我不知道

在.NET 4中,你可以这样做:

 String.Concat(Enumerable.Repeat("Hello", 4)) 

请注意,如果您的“string”只是一个字符,则会有string构造函数的重载来处理它:

 int multipler = 10; string TenAs = new string ('A', multipler); 

不幸的是/幸运的是,string类是密封的,所以你不能inheritance它,并重载*运算符。 您可以创build一个扩展方法:

 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); 

我在这个DrJokepu ,但如果由于某种原因,你确实想使用内置function作弊,那么你可以这样做:

 string snip = "</li></ul>"; int multiplier = 2; string result = string.Join(snip, new string[multiplier + 1]); 

或者,如果您使用.NET 4:

 string result = string.Concat(Enumerable.Repeat(snip, multiplier)); 

就个人而言,我不会打扰 – 自定义扩展方法更好。

只是为了完整性 – 这是另一种做法:

 public static string Repeat(this string s, int count) { var _s = new System.Text.StringBuilder().Insert(0, s, count).ToString(); return _s; } 

我想我前一段时间从Stack Overflow中抽取了一个,所以这不是我的想法。

你必须写一个方法 – 当然,用C#3.0它可能是一个扩展方法:

 public static string Repeat(this string, int count) { /* StringBuilder etc */ } 

然后:

 string bar = "abc"; string foo = bar.Repeat(2); 

有点迟了(只是为了好玩),如果你真的想用*操作符来完成这项工作,你可以这样做:

 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 } } 

所以:

 var newStr = new StringWrap("TO_REPEAT") * 5; 

请注意,只要你能够为他们find合理的行为,你也可以通过StringWrap类来处理其他操作符,比如\^%等等。

PS:

Multiply()扩展信用到@DrJokepu保留所有权利;-)

这更简洁一些:

 new StringBuilder().Insert(0, "</li></ul>", count).ToString() 

using System.Text;的命名空间using System.Text; 应该在这种情况下import。

 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(); } 

如果你有.Net 3.5但不是4.0,你可以使用System.Linq的

 String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray()) 

由于每个人都在添加他们自己的.NET4 / Linq例子,所以我不妨join我自己的例子。 (基本上DrJokepu的,简化为一行)

 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(); } 

好的,这是我的事情:

 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()); } } 

我当然有点傻,但是当我需要在代码生成类中使用列表时,Enumerable.Repeat为我做了。 是的,StringBuilder版本也很好。

以下是我对此的看法,仅供将来参考:

  /// <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)); }