2010-07-01 5 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, आपके प्रश्न का उत्तर "बेहतर" से आपका क्या मतलब है इस पर निर्भर करता है। आपने कुछ संक्षेप कोड लिखा है जो काम करता है। "बेहतर" का अर्थ यह होगा कि कोड 'दोहराना' के बहुत बड़े मानों के लिए तेज़ी से निष्पादित होता है। क्या "बेहतर" का अर्थ यह होगा कि कोड कम से कम स्मृति की स्मृति का उपयोग करता है? क्या इसका मतलब यह होगा कि कोड को किस कोड को दिखाना चाहिए, इस बारे में कुछ धारणा को पढ़ना या अनुरूप होना आसान होगा? –

+3

रखरखाव के लिए _clever_ उत्तरों का मूल्यांकन करना सुनिश्चित करें। – Marc

उत्तर

3

कार्यात्मक प्रोग्रामिंग शैली दृष्टिकोण:
(की आवश्यकता कम से कम सी # 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

यह रूबी जैसा दिखता है :) –

+0

यह शानदार है। – AngryHacker

+0

इसकी उत्कृष्टता और लालित्य के लिए स्वीकार्य, इसकी दक्षता के लिए नहीं। दक्षता के लिए इमरे एल का जवाब देखें। – AngryHacker

4

मैं तार के एक StringBuilder जैसा कि वर्तमान में आप संभावित आवंटन कर रहे हैं और बहुत सारे deallocating का उपयोग करेंगे:

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

नहीं सबसे कुशल, लेकिन संक्षिप्त:

नेट 4:

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

.NET 3.0/3.5:

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

मुझे यह पसंद है - चालाक! –

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

क्यों नहीं 'परिणाम' 'चक्र' –

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

के बजाय 'एस, 0, दोहराएं)' यह चालाक भी है: डी –

+0

मुझे यह पसंद है! – fbstj

+1

आप बहुत चालाक हैं! मुझे नहीं पता कि मैं इसका उपयोग कैसे कर सकता हूं - अगले व्यक्ति जो कोड बनाए रखता है, शायद मुझे निराश करना चाहता है। – AngryHacker

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

मुझे आश्चर्य है कि अब तक कोई अपवॉट नहीं मिला है, क्योंकि बीसीएल पहले से ही पेशकश करने के अलावा यह कोई चालाकता पर भरोसा करने के लिए शायद सबसे सरल समाधान है। _ @ Imre L: _ आप 'StringBuilder.Insert (Int32, String, Int32)' के लिए एमएसडीएन दस्तावेज़ पृष्ठ पर एक लिंक जोड़ सकते हैं: http://msdn.microsoft.com/en-us/library/62eb5xsf.aspx – stakx

संबंधित मुद्दे