क्यों कोई चार नहीं है। String.Empty की तरह खाली करें?


259

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

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

myString.Replace ('c', '')

इसलिए myString से 'c' के सभी उदाहरण हटा दें।


1
हाँ, मैंने उस शब्द का इस्तेमाल बेहतर शब्द की कमी के लिए किया था। "" के बजाय String.Empty का उपयोग करने का अनुशंसित तरीका।
जोन वेंज

3
यदि आप कभी-कभी गलती से गलती से '' के बारे में चिंतित हैं, तो क्यों नहीं बस की लाइनों के साथ एक विस्तार विधि में कार्यक्षमता लपेटोRemoveAll(this string s, params char[] toRemove) ? आशय स्पष्ट रूप से सूचित किया जाएगा और आप कुछ भी गलत करने का जोखिम नहीं उठाएंगे।
बज़ल्म

12
@ हेंक - केवल एक ही कारण है कि मैं स्ट्रिंग का उपयोग करता हूं। खाली है क्योंकि मुझे खाली भावों द्वारा प्रदान किए गए रिक्त ऑब्जेक्ट को खाली उद्धरणों से बेहतर लगता है। खाली उद्धरण एक मर्ज समस्या, या एक चिन्तित विचार के परिणामस्वरूप हो सकता है, या यह उस कोड का वास्तविक आशय हो सकता है, जबकि खाली खाली मुझे स्पष्ट रूप से बताता है कि डेवलपर उस स्ट्रिंग के लिए डेटा नहीं है।
रिच मेल्टन

3
"" और स्ट्रिंग के बीच अंतर है। ऐसा नहीं है कि किसी को परवाह है, वास्तव में, लेकिन "" एक वस्तु बनाता है, जबकि string.Empty पहले से बने एक का उपयोग करता है। लेकिन फिर से, यह इतना छोटा है कि केवल विशेष स्थितियों में यह एक अलग स्थिति बना देगा
marcelo-ferraz

1
@ मार्सेलो-फ़राज़म, के बारे में ""एक वस्तु बनाता है : नहीं, यह नहीं है।
हेंक होल्टरमैन

जवाबों:


271

खाली चार जैसी कोई चीज नहीं है। निकटतम आप प्राप्त कर सकते हैं '\0', यूनिकोड "अशक्त" चरित्र है। यह देखते हुए कि आप इसे स्ट्रिंग शाब्दिक के भीतर एम्बेड कर सकते हैं या इसे बहुत आसानी से व्यक्त कर सकते हैं, आप इसके लिए एक अलग क्षेत्र क्यों चाहेंगे? समान रूप से, "यह भ्रमित करना आसान है ""और " "" तर्क लागू नहीं होते हैं'\0'

यदि आप इसका उदाहरण दे सकते हैं कि आप इसका उपयोग कहां करना चाहते हैं और आपको क्यों लगता है कि यह बेहतर होगा, तो यह मदद कर सकता है ...


2
\ N 'बाइट ऐरे-कैरेक्टर का अंत नहीं है? या मैं कुछ और के साथ भ्रमित कर रहा हूँ?
बर्तवान

5
@ बर्टवन: बाइट ऐरे के अंत में एक चरित्र क्यों होगा ? यह "शून्य समाप्त" तार के लिए उपयोग किया जाता है, हां।
जॉन स्कीट

35
Char.MinValue '\ 0' से बेहतर है
अलीपोस्ट

10
@ अलीओस्ताद: अगर कोई समान क्षेत्र Int32.Zeroहोता, तो क्या आप शाब्दिक 0 के बजाय उसका उपयोग करते? यदि नहीं, तो यहां क्या अंतर है?
जॉन स्कीट

7
@ अदम, @ जॉन - घंटी के लिए कोड क्या है? या बैकस्पेस बेहतर है, सोचें सोचें ... या शायद सोचने के बजाय चार.बैक्सस्पेस लिखना बेहतर है? एक और कारण - आप कहते हैं कि टर्मिनेटर के लिए '0' लिखना बेहतर है, इसके बजाय, Char.Terminator कहते हैं, हालांकि यह नहीं है - यह एक टाइपो बनाने के लिए बहुत आसान है (पूरी तरह से संकलित, ऊपर देखें), लेकिन लिखने की कोशिश करें Char.Termnator। गैर-जांच योग्य, कच्चे मूल्यों (जैसे बेवकूफ टाइपो के कारण अंतरिक्ष मिशन विफल) से बचने के लिए मेरे पास पर्याप्त कारण हैं।
ग्रीनोल्डमैन

87

एक तार, एक स्ट्रिंग के विपरीत, एक निश्चित आकार के साथ एक असतत चीज है। एक तार वास्तव में चार का एक कंटेनर है।

तो, Char.Empty वास्तव में उस संदर्भ में कोई मतलब नहीं है। यदि आपके पास एक चार है, तो यह खाली नहीं है।


3
बिल्कुल सही। यह पूछने के लिए समझ में आता है कि क्या कंटेनर खाली है या नहीं। इसका कोई मतलब नहीं है कि एक इंट या फ्लोट या चार का पूछना खाली है।
टेड

1
@ जो: फिर एक स्ट्रिंग एक रिक्त (गैर-रिक्त) वर्णों का संग्रह होने पर कैसे रिक्त हो सकती है? शायद बेवकूफ, क्षमा करें ...
user1477388

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

2
मैं इसे वाक्यांश के रूप में "एक चर एक आदिम, मूल्य प्रकार, और एक स्ट्रिंग गैर-आदिम, संदर्भ प्रकार" है।
समिस

3
यही असली जवाब है।
गंडाल्फ 458

31

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


28

उपयोग करें Char.MinValueजो '0' के समान काम करता है। लेकिन सावधान रहें यह वैसा नहीं है String.Empty


धन्यवाद, पहले ऐसा नहीं देखा। क्या आपको पता है कि यह myString.Replace ('c', Char.MinValue) में काम करता है? मुझे इसे आज़माना चाहिए।
जोन वेंज

19

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

char? c

यह अनुमति देता है ''? या सिर्फ अशक्त?
जोन वैज

आपके मामले में, आप ऐसा कर सकते हैं: myString.Replace ("c", (c == null? "": C.ToString ()))
paquetp

12

यदि आपको संपूर्ण स्ट्रिंग की आवश्यकता नहीं है, तो आप विलंबित निष्पादन का लाभ उठा सकते हैं:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChar(this IEnumerable<char> originalString, char removingChar)
    {
        return originalString.Where(@char => @char != removingChar);
    }
}

तुम भी कई पात्रों गठबंधन कर सकते हैं ...

string veryLongText = "abcdefghijk...";

IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChar('c')
            .RemoveChar('d')
            .Take(5);

... और केवल पहले 7 पात्रों का मूल्यांकन किया जाएगा :)

संपादित करें: या, और भी बेहतर:

public static class StringExtensions
{
    public static IEnumerable<char> RemoveChars(this IEnumerable<char> originalString,
        params char[] removingChars)
    {
        return originalString.Except(removingChars);
    }
}

और इसका उपयोग:

        var veryLongText = "abcdefghijk...";
        IEnumerable<char> firstFiveCharsWithoutCsAndDs = veryLongText
            .RemoveChars('c', 'd')
            .Take(5)
            .ToArray(); //to prevent multiple execution of "RemoveChars"

@ जोआन: धन्यवाद ... भले ही "प्रतिभाशाली" यह थोड़ा अतिरंजित है: पी (मैं अपने प्रदर्शन के बारे में नहीं जानता जब हटाने वाले एक बड़े सरणी बन जाएंगे ...)
कुख्यात

1
कल मैं भूल गया था: आप कैसे परिणाम चर "FirstFiveCharsWithoutCsAndDs" का उपयोग कर रहे हैं पर ध्यान दें। यदि आप इसे किसी अन्य "उपज" विधि (जैसे LINQ के) को पास नहीं करना चाहते हैं, तो तुरंत "टेक (5)" ... के बाद ".ToArray ()" को कॉल करें ... अन्यथा, "RemoveChars + Take" हर बार जब आप "पारंपरिक" फैशन में चर का उपयोग करते हैं तो श्रृंखला को निष्पादित किया जाएगा (उदाहरण के लिए, हर आप उस पर "काउंट ()" कहते हैं, या जब आप इसे "उपज वापसी" के बिना एक फाड़कर में पार कर लेते हैं)
कुख्यात

+1 अच्छी सोच। लेकिन यह मूल दृष्टिकोण के रूप में बनाए रखने योग्य या कुशल नहीं हो सकता है :)
nawfal

1
@nawfal दक्षता-वार आप सही हैं, लेकिन मुझे लगता है कि myString.Except ("c") myString.Replace ('c', '') की तुलना में अधिक घोषणात्मक है: P (और यह बहुत अच्छी तरह से स्कोर करता है: myRring.Except ( "aeiou"))
कुख्यात

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

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

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

6

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


2
null संभव नहीं है क्योंकि char एक वैल्यू टाइप है। आपको चार का उपयोग करना होगा? इसे अशक्त करने में सक्षम होने के लिए।
फेमारेफ

आप इसे नीरस बना सकते हैं। मेरा जवाब
देखिये

5

एक चार्ट एक मूल्य प्रकार है, इसलिए इसका मान शून्य नहीं हो सकता है। (जब तक यह एक अशक्त कंटेनर में लपेटा नहीं जाता है)।

चूंकि यह शून्य नहीं हो सकता है, इसमें कुछ संख्यात्मक कोड शामिल हैं और प्रत्येक कोड को कुछ वर्णों में मैप किया गया है।


4

आपके प्रश्न का उत्तर नहीं है, लेकिन एक डिफ़ॉल्ट को निरूपित करने के लिए charआप बस उपयोग कर सकते हैं

default(char)

जो जैसा है char.MinValue, बदले में वैसा ही है \0। हालांकि एक खाली स्ट्रिंग की तरह कुछ के लिए उपयोग नहीं करना चाहिए।


1

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

myString.Replace("c", "")

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


1

आप चरित्र से अपने स्ट्रिंग चरित्र का पुनर्निर्माण भी कर सकते हैं, उन पात्रों को छोड़कर, जिनसे आप छुटकारा चाहते हैं।

ऐसा करने के लिए यहां एक विस्तार विधि दी गई है:

    static public string RemoveAny(this string s, string charsToRemove)
    {
        var result = "";
        foreach (var c in s)
            if (charsToRemove.Contains(c))
                continue;
            else
                result += c;

        return result;
    }

यह चालाक या फैंसी नहीं है, लेकिन यह अच्छी तरह से काम करता है।

इस तरह का उपयोग करें:

string newString = "My_String".RemoveAny("_"); //yields "MyString"

एक का उपयोग करें StringBuilderके लिए result। लपेटते क्यों नहीं return s.Replace(charsToRemove,"");?
aloisdg

1

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

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

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

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

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


0

BOM के बारे में , जादुई चरित्र Microsoft फ़ाइलों की शुरुआत में जोड़ता है (कम से कम XML)?


यहाँ विकिपीडिया पर शब्दांकन काफी दुर्भाग्यपूर्ण है; BOM इस संदर्भ में एक चरित्र नहीं है। और आपका सवाल क्या है? :)
bzlm

@onemach, इसलिए, क्या myString.Replace ('c', '')हासिल किया जा सकता है myString.Replace ('c', UTF_BOM)। फिर मैं कहूंगा कि इसका उत्तर "कैसे नहीं है ..." है।
bzlm

0

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

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());
            }

        }

    }

0

C # भाषा के संदर्भ में, निम्नलिखित बहुत मायने नहीं रख सकता है। और यह सवाल का सीधा जवाब नहीं है। लेकिन fowlloing है जो मैंने अपने व्यवसाय परिदृश्य में किया था

        char? myCharFromUI = Convert.ToChar(" ");
        string myStringForDatabaseInsert = myCharFromUI.ToString().Trim();
        if (String.IsNullOrEmpty(myStringForDatabaseInsert.Trim()))
        {
            Console.Write("Success");
        }

nullऔर white spaceथा विभिन्न व्यावसायिक अपने प्रोजेक्ट में बहती है। डेटाबेस में सम्मिलित करते समय, मुझे डेटाबेस में सम्मिलित empty stringकरने की आवश्यकता होती है यदि यह सफेद स्थान है।


0

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

// 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));
        }

    }

}


-3

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

cl = cl.Trim(' ');

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


यह उपयोगी है यदि कोई उपयोग करना चाहता है। अन्य व्हाट्सएप को हटाने के नकारात्मक पहलू के साथ .Replace ('c', '')। लेकिन दिए गए अन्य उत्तरों की तुलना में इसका अधिक उपयोगी है।
9

1
नहीं यह गलत है! ट्रिम केवल एक स्ट्रिंग को बीच में नहीं शुरू और अंत से
चार्ट को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.