142

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

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

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

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

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

编辑:我知道我可以轻松编写自己的函数来实现它,我只是想知道是否有一些我不知道的奇怪的字符串运算符

4

13 回答 13

240

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

String.Concat(Enumerable.Repeat("Hello", 4))
于 2010-07-21T08:54:49.123 回答
117

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

int multipler = 10;
string TenAs = new string ('A', multipler);
于 2009-02-10T16:57:15.230 回答
62

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

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);
于 2009-02-10T15:59:56.740 回答
12

我和 DrJokepu 一起讨论这个问题,但如果出于某种原因您确实想使用内置功能作弊,那么您可以执行以下操作:

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

我个人不会打扰 - 自定义扩展方法要好得多。

于 2009-02-10T16:13:52.883 回答
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 中取出了那个,所以这不是我的主意。

于 2009-06-05T20:44:48.557 回答
9

您必须编写一个方法 - 当然,对于 C# 3.0,它可能是一个扩展方法:

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

然后:

string bar = "abc";
string foo = bar.Repeat(2);
于 2009-02-10T16:00:01.327 回答
9

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

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类来处理其他的操作符,比如\, ^,%等等...

PS:

Multiply()@DrJokepu的扩展学分保留所有权利;-)

于 2011-09-12T21:04:09.377 回答
8

这更简洁:

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

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

于 2011-12-15T12:17:55.203 回答
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();
}
于 2009-02-10T16:01:15.503 回答
2

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

String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())
于 2010-07-22T05:38:35.117 回答
2

由于每个人都在添加自己的 .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();
}
于 2010-12-16T19:57:27.177 回答
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 版本也很好。

于 2009-02-10T16:45:17.600 回答
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));
    }
于 2010-07-21T08:52:08.037 回答