2010-07-01 27 views
5

Tôi có chức năng sau đây lấy một chuỗi làm tham số và lặp lại nó một số lần (cũng là một tham số). Tôi cảm thấy như đây là một cái gì đó đã có trong khung hoặc ít nhất có thể được thực hiện tốt hơn. Bất kỳ đề xuất?Làm thế nào để viết lại hàm lặp lại này tốt hơn

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

AngryHacker, câu trả lời cho câu hỏi của bạn phụ thuộc vào ý bạn là "tốt hơn". Bạn đã viết một số mã súc tích hoạt động. Sẽ "tốt hơn" có nghĩa là mã thực hiện nhanh hơn cho các giá trị rất lớn của 'lặp lại'. Sẽ "tốt hơn" có nghĩa là mã sử dụng số lượng bộ nhớ ít nhất có thể? Nó có nghĩa là mã sẽ dễ đọc hơn hoặc phù hợp với một số khái niệm về mã sẽ trông như thế nào? –

+3

Hãy chắc chắn đánh giá _clever_ câu trả lời để bảo trì. – Marc

Trả lời

3

chức năng tiếp cận lập trình theo kiểu:
(yêu cầu ít nhất là 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; 
    } 
} 

Cách sử dụng:

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

(Chắc chắn không phải là giải pháp hiệu quả nhất, và do sự đệ quy luôn có sự nguy hiểm của stack overflow với các giá trị bất hợp lý lớn cho count; nhưng tôi vẫn muốn chia sẻ một cách tiếp cận hơi khác, dễ hiểu.)

+0

Điều này trông giống như ruby ​​:) –

+0

Đó là phẳng ra tuyệt vời. – AngryHacker

+0

Được chấp nhận vì sự tuyệt vời và sang trọng của nó, không phải vì hiệu quả của nó. Để biết hiệu quả, hãy xem câu trả lời của Imre L. – AngryHacker

4

Tôi muốn sử dụng một StringBuilder như hiện nay bạn đang có khả năng phân bổ và deallocating nhiều chuỗi:

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

Hoặc thậm chí tốt hơn nếu chuỗi duy nhất là một đĩa đơn ký tự:

private string chr(char s, int repeat) 
{ 
    StringBuilder result = new StringBuilder(); 
    result.Append(s, repeat); 
    return result.ToString(); 
} 
4

Không phải là hiệu quả nhất, nhưng súc tích:

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

Tôi thích điều này - thông minh! –

4

Nếu đầu vào của bạn là thực sự là một nhân vật duy nhất chứ không phải là một chuỗi, bạn chỉ cần làm điều này:

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

Nếu không, tôi không nghĩ rằng còn nhiều việc khác để làm om sử dụng StringBuilder thay vì nối:

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

tại sao không 'result.Append (s, 0, repeat)' thay vì 'for' cycle –

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

Điều này cũng rất thông minh: D –

+0

Tôi làm như thế này! – fbstj

+1

Bạn quá thông minh! Tôi không biết nếu tôi có thể sử dụng điều này mặc dù - người tiếp theo người duy trì mã có thể sẽ muốn chia tay tôi. – AngryHacker

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

Cải tiến quan trọng nhất mà bạn có thể thực hiện cho chức năng của mình là đặt tên mô tả.

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

Tôi ngạc nhiên rằng điều này đã không có bất kỳ upvotes cho đến nay, vì nó có lẽ là giải pháp đơn giản nhất cho dựa vào không khéo léo ngoài việc sử dụng những gì BCL đã cung cấp. _ @ Imre L: _ Bạn có thể thêm một liên kết đến trang tài liệu MSDN cho 'StringBuilder.Insert (Int32, String, Int32)': http://msdn.microsoft.com/en-us/library/62eb5xsf.aspx – stakx

Các vấn đề liên quan