我可以“乘”一个字符串(在 C # 中)吗?

例如,假设我有一个字符串,

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

我想根据一些整数值,把它写多次。

string snip =  "</li></ul>";
int multiplier = 2;


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

编辑: 我知道我可以很容易地编写我自己的函数来实现它,我只是想知道是否有一些奇怪的字符串操作符,我不知道

97093 次浏览

不幸的是/幸运的是,字符串类是密封的,因此您无法从它继承并重载 * 操作符。你可以创建一个扩展方法:

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

你必须编写一个方法——当然,使用 C # 3.0,它可以是一个扩展方法:

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

然后:

string bar = "abc";
string foo = bar.Repeat(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();
}

好吧,我是这么想的:

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

当然我有点傻,但是当我需要在代码生成类中使用列表时,可枚举。重复一遍就行了。是的,StringBuilder 版本也很好。

注意,如果您的“ string”只是一个字符,那么有一个超载的 string 构造函数来处理它:

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

为了完整起见,这里有另一种方法:

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

我想这是我从 Stack Overflow 那里拿来的,所以这不是我的主意。

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

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

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

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

如果你有.Net 3.5而不是4.0,你可以使用 System.Linq’s

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

因为每个人都在加自己的。例如 NET4/Linq,我不妨加上我自己的。(基本上,它是 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 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类处理其他操作符,如 \^%等。.

附言:

Multiply()延长信贷至 @ Jokepu 医生保留所有权利; -)

这句话要简洁得多:

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

在这种情况下,应该导入名称空间 using System.Text;