Умножение строк в C #

Возможный дубликат:
Могу ли я умножить строку (на C #)?

В Python я могу сделать это:

>>> i = 3
>>> 'hello' * i
'hellohellohello'

Как я могу умножать строки в C # так же, как в Python? Я мог бы легко сделать это в цикле for, но это становится утомительным и невыразительным.

В конечном итоге я рекурсивно выписываю текст на консоль, при этом уровень отступа увеличивается с каждым вызовом.

parent
    child
    child
    child
        grandchild

И проще всего было бы просто сделать "\t" * indent.


person Colin Burnett    schedule 05.06.2009    source источник
comment
Напишите метод расширения, чтобы можно было выполнить hello.times (5). (Я бы сделал это в ответ, если бы знал C #).   -  person Michael Myers    schedule 06.06.2009
comment
Если C # не допускает перегрузки оператора; Имеет ли это?   -  person Michael Myers    schedule 06.06.2009
comment
@mmyers добавление поведения к классам по умолчанию считается вредным   -  person Eric    schedule 06.06.2009
comment
@ Эрик: Кто считает вредным? Это может быть чрезвычайно полезно. У меня не было бы с этим проблем.   -  person Jon Skeet    schedule 06.06.2009
comment
Точный дубликат stackoverflow .com / questions / 532892 / can-i-multiply-a-string-in-c /.   -  person Binary Worrier    schedule 06.06.2009
comment
@Eric: видимость метода расширения ограничена объявленным пространством имен этого метода, а не для всех пользователей расширенного типа.   -  person Jimmy    schedule 06.06.2009


Ответы (11)


Для него есть способ расширения в этом сообщении .

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);
person Shane Fulmer    schedule 05.06.2009
comment
Я бы сделал множитель uint, чтобы предотвратить бесконечные циклы. - person Eric; 06.06.2009
comment
Очень красиво. Я обязательно начну этим пользоваться. - person Chris Van Opstal; 06.06.2009
comment
Если множитель отрицательный, при создании StringBuilder будет выброшено исключение, и цикл даже не запустится в любом случае ... - person Joey; 06.06.2009
comment
Использование StringBuilder для этого, вероятно, является излишним, если только множитель обычно не очень велик (например, в тысячах). - person technophile; 06.06.2009
comment
Судя по моему собственному тестированию, использование StringBuilder, в котором вы указываете размер буфера (как здесь), снижает даже скорость примерно с 3-4 конкатенациями. - person JulianR; 06.06.2009
comment
@JulianR Полезно знать, спасибо! - person technophile; 07.07.2009

Если вам нужен только один персонаж, вы можете:

new string('\t', i)

Дополнительную информацию см. В этом сообщении.

person Chris Van Opstal    schedule 05.06.2009
comment
Это работает для моей непосредственной проблемы, поэтому я думаю, что это принятый ответ. В общем, это не сработает. :) - person Colin Burnett; 06.06.2009
comment
Я действительно думаю, что метод расширения, опубликованный Шейном Фулмером, является лучшим решением. Я бы отметил его ответ как ответ ИМХО. - person Chris Van Opstal; 06.06.2009
comment
@ Крис, как мне тогда выбрать между лучшим ответом на мою конкретную проблему, которая привела к этому вопросу, и лучшим, более общим ответом? - person Colin Burnett; 06.06.2009
comment
Я думаю, что ответ Шейна Фулмера - более элегантное решение вашей конкретной проблемы. После того, как вы его реализуете, просто выполните \ t.Multiply (i). Я не говорю, что не ценю баллы :), просто думаю, что его решение лучше. - person Chris Van Opstal; 06.06.2009

Вот как я это делаю ...

string value = new string(' ',5).Replace(" ","Apple");
person Zachary    schedule 05.06.2009
comment
Я провел несколько простых тестов производительности и обнаружил, что это быстрее, чем версия StringBuilder или string.Join. - person enzi; 07.02.2011
comment
Это решение сделало мой день просто счастливым! - person ; 11.09.2020

В BCL нет ничего встроенного для этого, но немного LINQ может выполнить задачу достаточно легко:

var multiplied = string.Join("", Enumerable.Repeat("hello", 5).ToArray());
person Noldorin    schedule 05.06.2009

Один из способов сделать это - но это не так уж и приятно.

 String.Join(String.Empty, Enumerable.Repeat("hello", 3).ToArray())

ОБНОВЛЕНИЕ

Аааа ... помню ... для чарсов ...

 new String('x', 3)
person Daniel Brückner    schedule 05.06.2009
comment
Идентично моему. Не самый изящный, но по крайней мере простой. :) - person Noldorin; 06.06.2009
comment
Re: ваше обновление, см. Принятый ответ. - person Noldorin; 06.06.2009

как насчет агрегата linq ...

var combined = Enumerable.Repeat("hello", 5).Aggregate("", (agg, current) => agg + current);
person Scott Ivey    schedule 05.06.2009
comment
var комбинированный = Enumerable.Repeat (привет, 5) .Aggregate (новый StringBuilder (), (agg, current) = ›agg.Append (current)). ToString (); - person sehe; 21.03.2011

В C # такого оператора нет; лучше всего, вероятно, будет ваша собственная функция MultiplyString ().

person Aric TenEyck    schedule 05.06.2009

По миллиардерам:

public static string times(this string str, int count)
{
  StringBuilder sb = new StringBuilder();
  for(int i=0; i<count; i++) 
  {
    sb.Append(str);
  }
  return sb.ToString();
}
person John Weldon    schedule 05.06.2009

Пока вы хотите повторить только один символ, вы можете использовать конструктор String:

string indentation = new String('\t', indent);
person Guffa    schedule 05.06.2009

Я не думаю, что вы можете расширить System.String с помощью перегрузки оператора, но вы могли бы создать для этого класс-оболочку строки.

public class StringWrapper
{
    public string Value { get; set; }

    public StringWrapper()
    {
        this.Value = string.Empty;
    }

    public StringWrapper(string value)
    {
        this.Value = value;
    }

    public static StringWrapper operator *(StringWrapper wrapper,
                                           int timesToRepeat)
    {
        StringBuilder builder = new StringBuilder();

        for (int i = 0; i < timesToRepeat; i++)
        {
            builder.Append(wrapper.Value);
        }

        return new StringWrapper(builder.ToString());
    }
}

Тогда назовите это как ...

var helloTimesThree = new StringWrapper("hello") * 3;

И получить выгоду от ...

helloTimesThree.Value;

Конечно, разумно было бы, чтобы ваша функция отслеживала и передавала текущую глубину и выводила вкладки в цикле for на основе этого.

person 48klocs    schedule 05.06.2009

если вам нужна строка 3 раза, просто сделайте

string x = "hello";

string combined = x + x + x;
person Community    schedule 05.06.2009
comment
Не очень хорошо масштабируется ... - person Marc; 06.06.2009