2009-08-31 9 views
17

मैं समझता हूं कि मैं ToString()। IndexOf (...) को कॉल कर सकता हूं, लेकिन मैं एक अतिरिक्त स्ट्रिंग नहीं बनाना चाहता हूं। मैं समझता हूं कि मैं मैन्युअल रूप से एक खोज दिनचर्या लिख ​​सकता हूं। मुझे आश्चर्य है कि क्यों इस तरह की एक नियमित रूप से ढांचे में मौजूद नहीं है।स्ट्रिंगबिल्डर के पास इंडेक्सऑफ विधि क्यों नहीं है?

उत्तर

5

दुर्भाग्य से, स्ट्रिंग के लिए लागू कई विधियों को स्ट्रिंगबिल्डर के लिए लागू किया जा सकता था लेकिन ऐसा नहीं किया गया था। आप जिस चीज की परवाह करते हैं उसे जोड़ने के लिए एक्सटेंशन विधियों का उपयोग करने पर विचार करें।

1

ToString() को StringBuilder पर कॉल करना एक अतिरिक्त वस्तु नहीं है, भ्रमित रूप से। आंतरिक रूप से, StringBuilder प्रदर्शन के लिए एक स्ट्रिंग ऑब्जेक्ट स्टोर करता है; कॉलिंग ToString() बस उस ऑब्जेक्ट को लौटाता है।

+0

इस करता है, तो stringbuilder खुद को संशोधित करने के Tthen एक * नई * स्ट्रिंग बनाई गई है कहा जाता है प्रश्न के संदर्भ में सही नहीं है, आंतरिक बफर के अस्थिरता प्रबंधित कोड के संपर्क में नहीं है। – ShuggyCoUk

+0

@ ShuggyCoUk: मेरी टिप्पणी एक छोटी सी चमक थी। मैंने इसे हटा दिया है। –

+10

पिछली टिप्पणी को स्पष्ट करने के लिए, ToString को कॉल करने से बहुत अधिक ओवरहेड नहीं है। लेकिन जब आप इसे कॉल करते हैं, तो स्ट्रिंगबिल्डर के अगले संशोधन में ओवरहेड की प्रतिलिपि होगी। (यह एक वैध अनुकूलन है क्योंकि ToString आमतौर पर स्ट्रिंगबिल्डर के लिए आखिरी चीज होती है।) इसके परिणामस्वरूप, स्ट्रिंग-जैसी विधियों के कुशल कार्यान्वयन ToString का उपयोग नहीं कर सकते हैं, जो मूल पोस्टर के मुद्दे के लिए एक छोटा समाधान रोकता है। –

36

मुझे पता है कि यह एक पुराना सवाल है, हालांकि मैंने एक विस्तार विधि लिखा है जो IndexOf को StringBuilder पर करता है। यह नीचे है। मुझे आशा है कि यह किसी भी व्यक्ति को यह प्रश्न मिलेगा, या तो Google से स्टैक ओवरव्लो खोज रहा है।

/// <summary> 
/// Returns the index of the start of the contents in a StringBuilder 
/// </summary>   
/// <param name="value">The string to find</param> 
/// <param name="startIndex">The starting index.</param> 
/// <param name="ignoreCase">if set to <c>true</c> it will ignore case</param> 
/// <returns></returns> 
public static int IndexOf(this StringBuilder sb, string value, int startIndex, bool ignoreCase) 
{    
    int index; 
    int length = value.Length; 
    int maxSearchLength = (sb.Length - length) + 1; 

    if (ignoreCase) 
    { 
     for (int i = startIndex; i < maxSearchLength; ++i) 
     { 
      if (Char.ToLower(sb[i]) == Char.ToLower(value[0])) 
      { 
       index = 1; 
       while ((index < length) && (Char.ToLower(sb[i + index]) == Char.ToLower(value[index]))) 
        ++index; 

       if (index == length) 
        return i; 
      } 
     } 

     return -1; 
    } 

    for (int i = startIndex; i < maxSearchLength; ++i) 
    { 
     if (sb[i] == value[0]) 
     { 
      index = 1; 
      while ((index < length) && (sb[i + index] == value[index])) 
       ++index; 

      if (index == length) 
       return i; 
     } 
    } 

    return -1; 
} 
+1

यह कहा गया है [जब आप तुलना के लिए तारों को सामान्य करते हैं तो स्ट्रिंग.ToLowerInvariant विधि के बजाय String.ToUpperInvariant विधि का उपयोग करें] (https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices -strings # सिफारिशों के लिए स्ट्रिंग-उपयोग)। मुझे लगता है कि यह वर्णों की तुलना के लिए भी सच है: [Char.ToUpper और Char.ToLower समान रूप से स्ट्रिंग के लिए काम करते हैं। ToUpper और String। पिछले अनुभाग में वर्णित कम विधियों] (https://docs.microsoft.com/en-us/डॉटनेट/मानक/बेस-प्रकार/सर्वोत्तम-प्रथाओं-तार # चार्टूपर-और-चार्टोलॉवर) – Sergey

+0

मेला कॉल; उपर्युक्त पोस्ट में संपादन करने के लिए स्वतंत्र महसूस करें। – Dennis

+1

क्षमा करें, मैं गलत था। असल में माइक्रोसॉफ्ट ने अनुकूलित किया है * ToUpperInvariant() *, नहीं * ToUpper() *। इस मामले में, हम डिफ़ॉल्ट रूप से * ToUpperInvariant() * प्रदान नहीं कर सकते हैं, जहां तक ​​यह तुर्की जैसी कुछ भाषाओं में गलत तुलना कर सकता है। तो, इस संबंध में, आपका कोड बिल्कुल सही है। – Sergey

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