2011-05-29 13 views
19

संभव डुप्लिकेट:
What's the best string concatenation method using C#?तेजी स्ट्रिंग संयोजन बनाने सी # में

हाय,

मैं इस तरह के कोड स्निपेट जहां डाटा की एक बड़ी सामग्री एक से पढ़ी जाती है फ़ाइल और कुछ मान के लिए प्रत्येक स्थिति की जांच करें और एक स्ट्रिंग को संगत करें।

इस स्ट्रिंग कॉन्सटेनेशन में बड़ी मात्रा में समय और प्रसंस्करण शक्ति होती है। क्या कोई दृष्टिकोण है जहां मैं निष्पादन समय को कम कर सकता हूं?

महत्वपूर्ण: पढ़ना सामग्री फ़ाइल वाक्य रचना सही नहीं है सिर्फ एक विचार

string x; 

while (var < File.Length) 
{ 
    if (File.Content[var] == "A") 
    { 
     x += 1;  
    } 
    else 
    { 
    x += 0; 
    } 
    var++; 
} 
+1

http://stackoverflow.com/questions/21078/whats-the-best-string- इस कहेंगे:

नमूना कोड कुछ इस तरह होगा concatenation-method-use-c –

+10

-1: भविष्य में, कोड का एक उदाहरण प्रदान करना जो वास्तव में आप कर रहे हैं (और वास्तव में सी #) के करीब है, उत्तरदाताओं को 'उपयोग की सामान्य आम सहमति' से बेहतर समाधान लिखने में मदद मिलेगी 'StringBuilder' '। उदाहरण के लिए, आप वास्तव में फ़ाइल को कैसे पढ़ रहे हैं, भले ही आप वास्तव में प्रत्येक चरित्र की जांच कर रहे हों, चाहे आप जो तारों को जोड़ रहे हैं वे वास्तव में एकल वर्ण हैं, आदि –

उत्तर

28

उपयोग StringBuilder बजाय स्ट्रिंग concatenations देने के लिए की जरूरत है।

एक स्ट्रिंगबिल्डर ऑब्जेक्ट नए डेटा के संयोजन को समायोजित करने के लिए एक बफर को बनाए रखता है। कमरा उपलब्ध होने पर बफर के अंत में नया डेटा जोड़ा जाता है; अन्यथा, एक नया, बड़ा बफर आवंटित किया जाता है, मूल बफर से डेटा को नए बफर में कॉपी किया जाता है, फिर नया डेटा नए बफर में जोड़ा जाता है।

इसके विपरीत स्ट्रिंग अपरिवर्तनीय है, हर बार जब आप इसे संयोजित करते हैं तो यह एक नई वस्तु बनाता है और पुराने लोगों को फेंकता है, जो बहुत अक्षम है।

इसके अलावा, यदि आप जानते हैं कि परिणाम बहुत बड़ा होगा, तो आप स्ट्रिंगबिल्डर के लिए पहले से ही उच्च क्षमता निर्धारित करना चाहेंगे। इससे बफर रीयलोकेशन की संख्या कम हो जाएगी।

यह इस प्रकार दिखाई देगा अपने छद्म कोड ले रहा है:

StringBulder x = new StringBuilder(10000); // adjust capacity to your needs 

while (var < File.Length) 
{ 
    if(File.Content[var] == "A") 
     x.Append("1"); // or AppendLine, or AppendFormat 
    else 
     x.Append("2"); 
} 
+0

उत्तर – Sudantha

+0

वास्तव में वोट गिनती के लिए बहुत बहुत धन्यवाद! – Sudantha

+3

@ सुधंथा: चूंकि ऐसा लगता है कि आप स्ट्रिंगबिल्डर के लिए नए हैं, तो यह उल्लेखनीय हो सकता है कि "कई" संगतता करते समय यह केवल फायदेमंद है। – Niklas

7

उपयोग एक StringBuilder बजाय, कि ज्यादा बेहतर प्रदर्शन करेंगे - तार का उपयोग कर आप एक नया स्ट्रिंग पाश जो का एक बहुत का कारण बनता है के भीतर हर बार बनाने के ओवरहेड/कचरा संग्रह, एक StringBuilder का उपयोग करके जो आप लूप के बाहर बनाते हैं, आप इससे बच सकते हैं।

19

System.Text.StringBuilder वह प्रकार है जिसे आप लूप में स्ट्रिंग कॉन्सटेनेशन ऑपरेशंस के लिए उपयोग करना चाहते हैं। यह कहीं अधिक कुशल होने जा रहा है। प्रत्येक पुनरावृत्ति के दौरान ऑब्जेक्ट पर .Append(value) का उपयोग करें।

StringBuilder builder = new StringBuilder(); 

// and inside your loop 
{ 
    if (blah) 
     builder.Append("1"); 
    else 
     builder.Append("0"); 
} 

string output = builder.ToString(); // use the final result 
+0

उत्तर के लिए धन्यवाद मुझे लगता है कि आप एलेक्स को सही जवाब देने के साथ ठीक हैं :) – Sudantha

6

एक स्ट्रिंगबिल्डर का उपयोग करें।

var sb = new StringBuilder(); 
sb.Append("abc"); 
sb.Append("def"); 
var str = sb.ToString(); 
7

StringBuilder का प्रयोग करें, स्ट्रिंग्स .net अर्थ है कि कभी संयोजन स्ट्रिंग की एक प्रतिलिपि बनाता में अडिग हैं।

Using the StringBuilder Class (MSDN)

StringBuilder sb = new StringBuilder(); 
sb.Append("1") // like so 
1

जब आप बाइट से एक फ़ाइल बाइट पढ़ा है, यह बहुत लंबा समय लग सकता है। मैं अनुशंसा करता हूं कि आप लूप में बाइट्स (उदाहरण के लिए 1024 या 2048) के ब्लॉक को पढ़ लें। फिर, आपके द्वारा ट्रैक किए गए ब्लॉक में, अपने चरित्र से मेल खाने के लिए नियमित अभिव्यक्ति का उपयोग करें, खासकर यदि आपके पास एक बहुत बड़ी फ़ाइल है।

private string GetFileData(string fileName, string matchChar) 
{ 
    StringBuilder x = new StringBuilder(); 
    int blockCount = 2048; 
    int offset = 0; 
    string pattern = matchChar; 
    int k = -1; 
    using (var sr = new System.IO.FileStream(fileName, System.IO.FileMode.Open)) 
    { 
     while ((sr.CanRead) && (k != 0)) 
     { 
      byte[] bt = new byte[blockCount]; 
      k = sr.Read(bt, 0, blockCount); 
      string so = System.Text.UTF8Encoding.UTF8.GetString(bt); 
      var m = new System.Text.RegularExpressions.Regex(pattern).Matches(so); 
      foreach (System.Text.RegularExpressions.Match item in m) 
      { 
       x.Append(item.Value); 
      } 
     } 
    } 
    return x.ToString(); 
} 

आप के रूप

GetFileData(@"c:\matchtest.ono", "a");