[c#] स्ट्रिंग की तरह कोई Char क्यों नहीं है। लक्षण?



9 Answers

तुम्हारा बयान

 myString.Replace ('c', '\0')

किसी भी अक्षर को नहीं हटाएगा। यह अलग-अलग परिणामों के साथ उन्हें '\0' (एंड-ऑफ-स्ट्रिंग, ईओएस) के साथ बदल देगा। ईओएस का सामना करते समय कुछ स्ट्रिंग ऑपरेशन बंद हो सकते हैं लेकिन .NET में अधिकांश क्रियाएं इसे किसी अन्य चार की तरह मानती हैं। जितना संभव हो सके '\0' से बचने के लिए सर्वश्रेष्ठ।

इस उपयोग का कारण यह था: myString.Replace ('c', '') तो myString से 'c' सभी उदाहरणों को हटा दें।

एक स्ट्रिंग से एक विशिष्ट चार को हटाने के लिए आप स्ट्रिंग अधिभार का उपयोग कर सकते हैं:

 myString = myString.Replace ("c", String.Empty);
Question

क्या इसका कोई कारण है? मैं पूछ रहा हूं क्योंकि यदि आपको बहुत सारे खाली वर्णों का उपयोग करने की आवश्यकता है तो आप उसी स्थिति में आ जाएंगे जब आप बहुत सारे खाली तारों का उपयोग करेंगे।

संपादित करें: इस उपयोग का कारण यह था:

myString.Replace ('c', '')

तो 'सी के myString से सभी उदाहरणों को हटा दें।




मुझे पता है कि यह एक बहुत पुराना है, लेकिन मुझे फ़ाइल नाम सुरक्षित करने के लिए हाल ही में कई प्रतिस्थापन करने के साथ एक समस्या का सामना करना पड़ा। सबसे पहले, नवीनतम .NET स्ट्रिंग में। फ़ंक्शन नल को रिक्त वर्ण के बराबर है। ऐसा कहकर, नेट से क्या गुम है, यह एक साधारण प्रतिस्थापन है जो वांछित चरित्र के साथ सरणी में किसी भी चरित्र को प्रतिस्थापित करेगा। कृपया नीचे दिए गए कोड का संदर्भ देने में संकोच न करें (परीक्षण के लिए लिंककैड में चलता है)।

// LinqPad .ReplaceAll and SafeFileName
void Main()
{

    ("a:B:C").Replace(":", "_").Dump();                     // can only replace 1 character for one character => a_B_C
    ("a:B:C").Replace(":", null).Dump();                    // null replaces with empty => aBC
    ("a:B*C").Replace(":", null).Replace("*",null).Dump();  // Have to chain for multiples 

    // Need a ReplaceAll, so I don't have to chain calls


    ("abc/123.txt").SafeFileName().Dump();
    ("abc/1/2/3.txt").SafeFileName().Dump();
    ("a:bc/1/2/3.txt").SafeFileName().Dump();
    ("a:bc/1/2/3.txt").SafeFileName('_').Dump();
    //("abc/123").SafeFileName(':').Dump(); // Throws exception as expected

}


static class StringExtensions
{

    public static string SafeFileName(this string value, char? replacement = null)
    {
        return value.ReplaceAll(replacement, ':','*','?','"','<','>', '|', '/', '\\');
    }

    public static string ReplaceAll(this string value, char? replacement, params char[] charsToGo){

        if(replacement.HasValue == false){
                return string.Join("", value.AsEnumerable().Where(x => charsToGo.Contains(x) == false));
        }
        else{

            if(charsToGo.Contains(replacement.Value)){
                throw new ArgumentException(string.Format("Replacement '{0}' is invalid.  ", replacement), "replacement");
            }

            return string.Join("", value.AsEnumerable().Select(x => charsToGo.Contains(x) == true ? replacement : x));
        }

    }

}



खाली चरित्र जैसी कोई चीज नहीं है। इसमें हमेशा कुछ होता है । यहां तक ​​कि '\ 0' एक चरित्र है।




आप nullable वर्णों का उपयोग कर सकते हैं।

char? c



स्ट्रिंग से किसी चरित्र को कंबल करने का सबसे आसान तरीका इसे ट्रिम करना है

cl = cl.Trim(' ');

एक स्ट्रिंग में सभी रिक्त स्थान हटा देता है




myString = myString.Replace('c'.ToString(), "");

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

myString = myString.Replace('\t'.ToString(), "");



वही कारण है कि कोई int.Empty नहीं है। कंटेनर खाली हो सकते हैं। स्केलर मान नहीं हो सकते हैं। यदि आपका मतलब 0 (जो खाली नहीं है), तो '\0' उपयोग करें। यदि आपका मतलब null , तो null उपयोग करें :)




आपके पहले प्रश्न का उत्तर नहीं देता - लेकिन आपके पास विशिष्ट समस्या के लिए, आप केवल वर्णों के बजाय तारों का उपयोग कर सकते हैं, है ना ?:

myString.Replace("c", "")

एक कारण है कि आप ऐसा नहीं करना चाहते हैं?




यदि आप स्ट्रिंग में रिक्त चार को लंबित करना चाहते हैं तो निम्नलिखित काम करेगा, बस आप चाहते हैं कि किसी भी डेटाटाइप प्रतिनिधित्व में कनवर्ट करें। धन्यवाद,

private void button1_Click(object sender, EventArgs e)
    {

        Int32 i;

        String name;

        Int32[] array_number = new int[100];

        name = "1 3  5  17   8    9    6";

        name = name.Replace(' ', 'x');

        char[] chr = name.ToCharArray();


        for (i = 0; i < name.Length; i++)
        {
            if ((chr[i] != 'x'))
            {
                array_number[i] = Convert.ToInt32(chr[i].ToString());
                MessageBox.Show(array_number[i].ToString());
            }

        }

    }



यदि आप एक विशिष्ट स्थिति को पूरा करने वाले वर्णों को हटाना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

string s = "SoMEthInG";
s = new string(s.ToCharArray().Where(c => char.IsUpper(c)).ToArray());

(यह केवल स्ट्रिंग में अपरकेस वर्ण छोड़ देगा।)

दूसरे शब्दों में, आप स्ट्रिंग को एक IEnumerable<char> परिवर्तित कर सकते हैं, उस पर परिवर्तन कर सकते हैं और उसके बाद इसे ऊपर दिखाए गए स्ट्रिंग में वापस परिवर्तित कर सकते हैं।

फिर, यह लैम्ब्डा अभिव्यक्ति के कारण न केवल एक विशिष्ट चार को हटाने में सक्षम बनाता है, हालांकि यदि आप लैम्ब्डा अभिव्यक्ति को इस तरह बदलते हैं तो आप ऐसा कर सकते हैं: c => c != 't'




Related