Могу ли я «умножить» строку (в C #)? - PullRequest
121 голосов
/ 10 февраля 2009

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

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

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

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

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

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

Ответы [ 13 ]

210 голосов
/ 21 июля 2010

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

String.Concat(Enumerable.Repeat("Hello", 4))
88 голосов
/ 10 февраля 2009

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

int multipler = 10;
string TenAs = new string ('A', multipler);
59 голосов
/ 10 февраля 2009

К сожалению / к счастью, класс 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);
11 голосов
/ 10 февраля 2009

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

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

10 голосов
/ 06 июня 2009

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

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

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

9 голосов
/ 10 февраля 2009

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

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

тогда:

string bar = "abc";
string foo = bar.Repeat(2);
7 голосов
/ 13 сентября 2011

Немного поздно (и просто для удовольствия), если вы действительно хотите использовать оператор * для этой работы, вы можете сделать это:

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 все права защищены; -)

5 голосов
/ 15 декабря 2011

Это намного лаконичнее:

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

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

2 голосов
/ 16 декабря 2010

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

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

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