2010-07-01 45 views
5

我有以下函數接受一個字符串作爲參數,並重復多次(也是一個參數)。我覺得這是已經在框架中的東西,或者至少可以做得更好。有什麼建議麼?如何更好地重寫此重複函數

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

AngryHacker,你的問題的答案取決於你的意思是「更好」。你已經寫了一些簡潔的代碼。 「更好」意味着代碼對於「repeat」的非常大的值執行速度更快。 「更好」意味着代碼儘可能少地使用內存?這是否意味着代碼會更容易閱讀或符合某些代碼的外觀? – 2010-07-01 21:00:39

+3

請務必評估_clever_答案的可維護性。 – Marc 2010-07-01 21:23:50

回答

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不合理的較大值的危險;但我仍然想分享一個稍微不同的,易於理解的方法。)

+0

這看起來像紅寶石:) – 2010-07-01 21:13:24

+0

這是平坦的真棒。 – AngryHacker 2010-07-01 21:22:40

+0

由於它的迷人和優雅,而不是其效率。有關效率,請參閱Imre L的答案。 – AngryHacker 2010-07-02 20:48:28

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(); 
} 
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()); 
+0

我喜歡這個 - 聰明! – 2010-07-01 20:56:51

4

如果你的輸入實際上是單個字符,而不是字符串,你可以簡單地做到這一點:

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

否則,我不認爲有很多事情要做一邊fr OM使用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(); 
} 
+0

爲什麼不'結果。附加(s,0,重複)'而不是'for'循環 – 2010-07-01 21:25:19

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

這也很聰明:D – 2010-07-01 20:58:40

+0

我喜歡這樣! – fbstj 2010-07-01 21:02:12

+1

你太聰明瞭!我不知道我是否可以使用它 - 下一個維護代碼的人可能會想要肢解我。 – AngryHacker 2010-07-01 21:05:10

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

您可以對您的功能做出的最重要的改進是給它一個描述性名稱。

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

我很驚訝,迄今爲止還沒有得到任何讚揚,因爲它可能是除了使用BCL已經提供的東西之外不依賴於任何聰明的最直接的解決方案。 _ @ Imre L:_您可以將鏈接添加到「StringBuilder.Insert(Int32,String,Int32)'的MSDN文檔頁面:http://msdn.microsoft.com/en-us/library/62eb5xsf.aspx – stakx 2010-07-02 20:36:45