Как лучше переписать эту функцию повтора - PullRequest
5 голосов
/ 02 июля 2010

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

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

Ответы [ 9 ]

5 голосов
/ 02 июля 2010

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

4 голосов
/ 02 июля 2010
private string chr (string s, int repeat) {
   string result = new String(' ', repeat).Replace(" ",  s);
   return result;
}
4 голосов
/ 02 июля 2010

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

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 голосов
/ 02 июля 2010

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

.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 голосов
/ 02 июля 2010

Я бы использовал 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();
}
3 голосов
/ 02 июля 2010
return new System.Text.StringBuilder().Insert(0,"repeatme",count).ToString()
3 голосов
/ 02 июля 2010

Функциональный подход в стиле программирования:
(требуется минимум 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; но, тем не менее, я хотел поделиться немного другим, простым для понимания подход.)

1 голос
/ 02 июля 2010
private string chr(string s, int repeat)
{
    return Enumerable.Range(0, repeat)
        .Aggregate(new StringBuilder(), (sb, i) => sb.Append(s)).ToString();
}
1 голос
/ 02 июля 2010

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

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

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

...