假设我有一个字符串,例如
string snip = "</li></ul>";
我想基本上写多次,具体取决于某个整数值。
string snip = "</li></ul>";
int multiplier = 2;
// TODO: magic code to do this
// snip * multiplier = "</li></ul></li></ul>";
编辑: 我知道我可以轻松编写自己的函数来实现它,我只是想知道是否有一些我不知道的奇怪的字符串运算符
答案 0 :(得分:210)
在.NET 4中,您可以这样做:
String.Concat(Enumerable.Repeat("Hello", 4))
答案 1 :(得分:88)
请注意,如果您的“字符串”只是一个字符,则会有一个字符串构造函数的重载来处理它:
int multipler = 10;
string TenAs = new string ('A', multipler);
答案 2 :(得分:59)
不幸的是/幸运的是,字符串类是密封的,所以你不能从它继承并重载*运算符。您可以创建扩展方法:
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);
答案 3 :(得分:11)
I'm with DrJokepu on this one,但如果由于某种原因你确实想使用内置功能作弊,那么你可以这样做:
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));
我个人不会打扰 - 自定义扩展方法更好。
答案 4 :(得分:10)
只是为了完整性 - 这是另一种方法:
public static string Repeat(this string s, int count)
{
var _s = new System.Text.StringBuilder().Insert(0, s, count).ToString();
return _s;
}
我想我之前从Stack Overflow中删除了那个,所以这不是我的想法。
答案 5 :(得分:9)
你必须编写一个方法 - 当然,使用C#3.0它可能是一个扩展方法:
public static string Repeat(this string, int count) {
/* StringBuilder etc */ }
然后:
string bar = "abc";
string foo = bar.Repeat(2);
答案 6 :(得分:7)
有点晚(而且只是为了好玩),如果你真的想使用*
运算符来完成这项工作,你可以这样做:
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;
请注意,只要您能够找到合理的行为,您还可以通过StringWrap
类处理其他运算符,例如\
,^
,{{1等等......
<强> P.S:强>
%
分机信用额@DrJokepu保留所有权利; - )
答案 7 :(得分:5)
这简洁得多:
new StringBuilder().Insert(0, "</li></ul>", count).ToString()
在这种情况下,应导入名称空间using System.Text;
。
答案 8 :(得分:2)
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();
}
答案 9 :(得分:2)
如果你有.Net 3.5但不是4.0,你可以使用System.Linq的
String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())
答案 10 :(得分:2)
由于每个人都在添加他们自己的.NET4 / Linq示例,我不妨添加自己的。 (基本上,它是DrJokepu's,简化为单行)
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();
}
答案 11 :(得分:0)
好的,这是我对此事的看法:
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版本也很好。
答案 12 :(得分:0)
以下是我对此的看法,仅供将来参考:
/// <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));
}