string myString = "ABCDEFGHIJ";
string modifiedString = new StringBuilder(myString){[3]='Z', [4]='X'}.ToString();
मुझे मेरे समाधान की व्याख्या करें।
अपनी दो विशिष्ट स्थिति ("स्थिति 4 से स्थिति 5") में दो वर्ण 'Z' और 'X' के साथ एक स्ट्रिंग को बदलने की समस्या कथन को देखते हुए और स्ट्रिंग को बदलने के लिए स्थिति सूचकांक का उपयोग करने के लिए कहें और स्ट्रिंग को प्रतिस्थापित न करें ( ) विधि (वास्तविक स्ट्रिंग में कुछ वर्णों की पुनरावृत्ति की संभावना के कारण हो सकता है), मैं उपयोग Substring()और स्ट्रिंग Concat()या स्ट्रिंग Remove()और Insert()दृष्टिकोण पर लक्ष्य को प्राप्त करने के लिए न्यूनतम दृष्टिकोण का उपयोग करना पसंद करूंगा । हालांकि वे सभी समाधान एक ही लक्ष्य को प्राप्त करने में उद्देश्य की पूर्ति करेंगे, लेकिन यह सिर्फ व्यक्तिगत पसंद और न्यूनतम दृष्टिकोण के साथ बसने के दर्शन पर निर्भर करता है।
ऊपर वर्णित मेरे समाधान पर वापस आ रहा है, अगर हम stringऔर के करीब देखोStringBuilder, वे दोनों आंतरिक रूप से पात्रों की एक सरणी के रूप में एक स्ट्रिंग का व्यवहार करते हैं। यदि हम इसके कार्यान्वयन को देखते हैं तो दिए गए स्ट्रिंग को कैप्चर करने के लिए StringBuilder" internal char[] m_ChunkChars;" जैसा एक आंतरिक चर रखता है । अब चूंकि यह एक आंतरिक चर है, हम सीधे उसी तक नहीं पहुंच सकते। बाहरी दुनिया के लिए, उस चरित्र सरणी को एक्सेस करने और बदलने में सक्षम होने के लिए, StringBuilderउन्हें अनुक्रमणिका संपत्ति के माध्यम से उजागर करता है जो नीचे कुछ दिखता है
[IndexerName("Chars")]
public char this[int index]
{
get
{
StringBuilder stringBuilder = this;
do
{
// … some code
return stringBuilder.m_ChunkChars[index1];
// … some more code
}
}
set
{
StringBuilder stringBuilder = this;
do
{
//… some code
stringBuilder.m_ChunkChars[index1] = value;
return;
// …. Some more code
}
}
}
ऊपर दिए गए मेरे समाधान ने इस अनुक्रमणिका क्षमता का लाभ उठाया कि आंतरिक रूप से बनाए रखा चरित्र सरणी को बदलने के लिए जो आईएमओ कुशल और न्यूनतम है।
BTW; हम उपरोक्त समाधान को फिर से नीचे की तरह अधिक विस्तृत रूप से लिख सकते हैं
string myString = "ABCDEFGHIJ";
StringBuilder tempString = new StringBuilder(myString);
tempString[3] = 'Z';
tempString[4] = 'X';
string modifiedString = tempString.ToString();
इस संदर्भ में यह भी उल्लेख करना चाहते हैं कि इसके मामले में stringइसके आंतरिक चरित्र सरणी को उजागर करने के साधन के रूप में भी अनुक्रमणिका संपत्ति है, लेकिन इस मामले में इसके पास केवल गेट्टर संपत्ति (और कोई सेटर) नहीं है क्योंकि स्ट्रिंग प्रकृति में अपरिवर्तनीय है। और यही कारण है कि हमें StringBuilderचरित्र सरणी को बदलने के लिए उपयोग करने की आवश्यकता है।
[IndexerName("Chars")]
public extern char this[int index] { [SecuritySafeCritical, __DynamicallyInvokable, MethodImpl(MethodImplOptions.InternalCall)] get; }
और अंतिम लेकिन कम से कम नहीं यह समाधान केवल इस विशिष्ट समस्या के लिए सबसे उपयुक्त है जहां पूछना केवल कुछ पात्रों को एक ज्ञात स्थिति इंडेक्स अपफ्रंट के साथ बदलना है। यह सबसे अच्छा फिट नहीं हो सकता है जब आवश्यकता एक काफी लंबी स्ट्रिंग को बदलने के लिए है यानी वर्णों की संख्या को बदलने के लिए संख्या में बड़ी हैं।