Могу ли я "размножить" строку (в С#)?

Предположим, что у меня есть строка, например

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

Я хочу в основном писать его несколько раз, в зависимости от некоторого целочисленного значения.

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

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

EDIT: Я знаю, что могу легко написать свою собственную функцию для реализации этого, мне просто интересно, был ли какой-то странный оператор строки, о котором я не знал о

Ответ 1

В .NET 4 вы можете сделать это:

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

Ответ 2

Обратите внимание, что если ваша "строка" - это только один символ, для ее обработки существует перегрузка конструктора строк:

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

Ответ 3

К сожалению/к счастью, класс string запечатан, поэтому вы не можете наследовать его и перегрузить оператор *. Вы можете создать метод расширения, хотя:

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

Ответ 4

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

Лично я бы не стал беспокоиться - пользовательский метод расширения намного приятнее.

Ответ 5

Просто для полноты - вот еще один способ сделать это:

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

Я думаю, что я вытащил это из Qaru некоторое время назад, так что это не моя идея.

Ответ 6

Вам нужно написать метод - конечно, с С# 3.0 это может быть метод расширения:

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

то

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

Ответ 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, например \, ^, % и т.д.

P.S:.

Multiply() кредиты расширения @DrJokepu все права защищены; -)

Ответ 8

Это намного более краткий:

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

В этом случае необходимо импортировать пространство имен using System.Text;.

Ответ 9

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

Ответ 10

Если у вас есть .Net 3.5, но не 4.0, вы можете использовать System.Linq

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

Ответ 11

Поскольку каждый добавляет свои собственные примеры .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();
}

Ответ 12

Хорошо, здесь я беру на себя дело:

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 тоже прекрасна.

Ответ 13

Здесь я беру на себя это только для справок в будущем:

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