Как лучше переписать эту повторную функцию

У меня есть следующая функция, которая берет строку в качестве параметра и повторяет его неоднократно (также параметр). Я чувствую, что это - что-то, что это уже находится в платформе или по крайней мере могло быть добито большего успеха. Какие-либо предложения?

private string chr(string s, int repeat)
{
    string result = string.Empty;
    for (int i = 0; i < repeat; i++)
    {
        result += s;
    }
    return result;
}
5
задан AngryHacker 1 July 2010 в 20:50
поделиться

9 ответов

Функциональные подход в стиле программирования:
(требуется как минимум C # 3.0)

static class StringRepetitionExtension
{
    public static string Times(this int count, string what)
    {
        return count > 0 ? string.Concat(what, (count-1).Times(what))
                         : string.Empty;
    }
}

Использование:

3.Times("Foobar")   // returns "FoobarFoobarFoobar"

(Конечно, не самое эффективное решение, и из-за рекурсии всегда существует опасность переполнения стека с неоправданно большими значениями для count ; но я, тем не менее, хотел поделиться немного другим, простым для понимания подходом.)

3
ответ дан 18 December 2019 в 05:48
поделиться

Самое важное улучшение, которое вы могли бы внести в свою функцию, - это дать ей описательное имя.

5
ответ дан 18 December 2019 в 05:48
поделиться

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

var someChar = 'f';
var repeat = 10;
var repeated = new String(someChar, repeat);

В противном случае, я не думаю, что есть еще что-то, кроме использования StringBuilder вместо конкатенации:

private string chr(string s, int repeat)
{
    var result = new StringBuilder(s.Length * repeat);
    for (int i = 0; i < repeat; i++)
    {
        result.Append(s);
    }
    return result.ToString();
}
4
ответ дан 18 December 2019 в 05:48
поделиться

Не самый эффективный, но краткий:

.NET 4:

String.Join(String.Empty, Enumerable.Repeat(s, repeat));

.NET 3.0 / 3.5:

String.Join(String.Empty, Enumerable.Repeat(s, repeat).ToArray());
4
ответ дан 18 December 2019 в 05:48
поделиться
private string chr (string s, int repeat) {
   string result = new String(' ', repeat).Replace(" ",  s);
   return result;
}
4
ответ дан 18 December 2019 в 05:48
поделиться

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

private string chr(string s, int repeat)
{
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < repeat; i++)
    {
        result.Append(s);
    }
    return result.ToString();
}

Или даже лучше, если строка состоит только из одного символа:

private string chr(char s, int repeat)
{
    StringBuilder result = new StringBuilder();
    result.Append(s, repeat);
    return result.ToString();
}
4
ответ дан 18 December 2019 в 05:48
поделиться
return new System.Text.StringBuilder().Insert(0,"repeatme",count).ToString()
3
ответ дан 18 December 2019 в 05:48
поделиться

Вы можете рассмотреть возможность использования StringBuilder, если ваш параметр repeat очень большой.

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

http://channel9.msdn.com/forums/TechOff/14294-C-string-vs-StringBuilder/

1
ответ дан 18 December 2019 в 05:48
поделиться
private string chr(string s, int repeat)
{
    return Enumerable.Range(0, repeat)
        .Aggregate(new StringBuilder(), (sb, i) => sb.Append(s)).ToString();
}
1
ответ дан 18 December 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: