2008-10-22 12 views
47

किसी ने मुझे बताया कि स्ट्रिंगबिल्डर के साथ स्ट्रिंग को जोड़ना तेज़ है। मैंने अपना कोड बदल दिया है लेकिन अंतिम निर्माण स्ट्रिंग प्राप्त करने के लिए मुझे कोई गुण या विधि दिखाई नहीं दे रही हैं।स्ट्रिंगबिल्डर: अंतिम स्ट्रिंग कैसे प्राप्त करें?

मैं स्ट्रिंग कैसे प्राप्त कर सकता हूं?

उत्तर

89

आप .ToString() का उपयोग StringBuilder से String प्राप्त करने के लिए कर सकते हैं।

8

एक बार जब आप स्ट्रिंगबिल्डर का उपयोग कर प्रसंस्करण पूरा कर लेते हैं, तो अंतिम परिणाम वापस करने के लिए ToString विधि का उपयोग करें।

MSDN से:

using System; 
using System.Text; 

public sealed class App 
{ 
    static void Main() 
    { 
     // Create a StringBuilder that expects to hold 50 characters. 
     // Initialize the StringBuilder with "ABC". 
     StringBuilder sb = new StringBuilder("ABC", 50); 

     // Append three characters (D, E, and F) to the end of the StringBuilder. 
     sb.Append(new char[] { 'D', 'E', 'F' }); 

     // Append a format string to the end of the StringBuilder. 
     sb.AppendFormat("GHI{0}{1}", 'J', 'k'); 

     // Display the number of characters in the StringBuilder and its string. 
     Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); 

     // Insert a string at the beginning of the StringBuilder. 
     sb.Insert(0, "Alphabet: "); 

     // Replace all lowercase k's with uppercase K's. 
     sb.Replace('k', 'K'); 

     // Display the number of characters in the StringBuilder and its string. 
     Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); 
    } 
} 

// This code produces the following output. 
// 
// 11 chars: ABCDEFGHIJk 
// 21 chars: Alphabet: ABCDEFGHIJK 
3

मैं सिर्फ इतना फेंकना चाहता हूं कि यह तेज़ी से तेज़ नहीं हो सकता है, यह निश्चित रूप से बेहतर स्मृति पदचिह्न होगा। ऐसा इसलिए है क्योंकि स्ट्रिंग .NET में अपरिवर्तनीय है और हर बार जब आप एक स्ट्रिंग बदलते हैं तो आपने एक नया बनाया है।

1

यह संगतता के लिए तेज़ नहीं है - जैसा कि smaclell ने बताया, मुद्दा एक अतिरिक्त आवंटन और मौजूदा डेटा की पुनरावृत्ति को मजबूर करने के लिए अपरिवर्तनीय स्ट्रिंग है।

"एक" + "ख" + "ग" स्ट्रिंग बिल्डर से कोई लेना देना नहीं तेजी से होता है, लेकिन एक मध्यवर्ती स्ट्रिंग तेजी से और तेजी concat के # के रूप में हो जाता है हो जाता है के साथ दोहराया concats जैसी बड़ी:

एक्स = "ए"; x + = "बी"; x + = "ग"; ...

1

यह बारे में तेजी से/बेहतर स्मृति किया जा रहा है:

मैं जावा के साथ इस समस्या की जांच करने, मुझे लगता है कि इसके बारे में नेट के रूप में स्मार्ट हो जाएगा।

स्ट्रिंग के लिए कार्यान्वयन बहुत प्रभावशाली है।

स्ट्रिंग वस्तु पटरियों "लंबाई" और "साझा" (सरणी कि स्ट्रिंग धारण की लंबाई से स्वतंत्र)

तो जैसे कुछ

String a = "abc" + "def" + "ghi"; 

(संकलक द्वारा लागू किया जा सकता/रनटाइम) के रूप में:

 
- Extend the array holding "abc" by 6 additional spaces. 
- Copy def in right after abc 
- copy ghi in after def. 
- give a pointer to the "abc" string to a 
- leave abc's length at 3, set a's length to 9 
- set the shared flag in both. 

चूंकि अधिकांश तार अल्पकालिक होते हैं, यह कई मामलों में कुछ बहुत ही कुशल कोड बनाता है। मामले में जहां यह बिल्कुल कुशल नहीं है जब आप एक पाश के भीतर एक स्ट्रिंग के लिए जोड़ रहे हैं या जब अपने कोड इस तरह है:

a = "abc"; 
a = a + "def"; 
a += "ghi"; 

इस मामले में, आप एक StringBuilder निर्माण का उपयोग कर बंद काफी बेहतर हैं।

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

स्ट्रिंग स्रोत कोड को देखने से पहले मैंने तारों, कैशिंग/स्ट्रिंग-बिल्डर्स और परीक्षण की गति का उपयोग करके 3 दिन गड़बड़ कर दिया और यह पता लगाया कि संकलक पहले से ही मेरे उपयोग के मामले के मुकाबले बेहतर कर रहा था।तब मुझे यह बताना पड़ा कि मैं वास्तव में नहीं जानता था कि मैं क्या कर रहा था, मैंने केवल सोचा था कि मैंने किया था ...

11

जब आप कहते हैं कि "स्ट्रिंग बिल्डर के साथ स्ट्रिंग को जोड़ना तेज़ है", तो यह केवल तभी सच है यदि आप बार-बार (मैं दोहराता हूं - बार-बार) एक ही ऑब्जेक्ट को जोड़कर।

यदि आप केवल 2 स्ट्रिंग्स को जोड़ रहे हैं और string के रूप में परिणाम के साथ कुछ कर रहे हैं, तो StringBuilder का उपयोग करने का कोई मतलब नहीं है।

मैं सिर्फ इस के जॉन स्कीट का अच्छा ऊपर लिखने पर ठोकर खाई: http://www.yoda.arachsys.com/csharp/stringbuilder.html

आप StringBuilder का उपयोग कर रहे हैं, तो जिसके परिणामस्वरूप string प्राप्त करने के लिए, यह बुला ToString() (आश्चर्य) का मामला है।

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

  • कोई संबंधित समस्या नहीं^_^