如何更好地重写这个重复功能

时间:2010-07-01 20:50:19

标签: c#-3.0 refactoring

我有以下函数,它将一个字符串作为参数并重复多次(也是一个参数)。我觉得这已经存在于框架中,或者至少可以做得更好。有什么建议吗?

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

9 个答案:

答案 0 :(得分:5)

您可以对您的功能进行的最重要的改进是为其提供一个描述性名称。

答案 1 :(得分:4)

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

答案 2 :(得分:4)

不是最有效但最简洁的:

.NET 4:

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

.NET 3.0 / 3.5:

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

答案 3 :(得分:4)

如果您的输入实际上是单个字符而不是字符串,则可以执行此操作:

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 :(得分:4)

private string chr (string s, int repeat) {
   string result = new String(' ', repeat).Replace(" ",  s);
   return result;
}

答案 5 :(得分:3)

功能性编程风格的方法:
(至少需要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的值不合理地大;但是我想分享一个稍微不同的,容易的 - 理解方法。)

答案 6 :(得分:3)

return new System.Text.StringBuilder().Insert(0,"repeatme",count).ToString()

答案 7 :(得分:1)

答案 8 :(得分:1)

private string chr(string s, int repeat)
{
    return Enumerable.Range(0, repeat)
        .Aggregate(new StringBuilder(), (sb, i) => sb.Append(s)).ToString();
}