बेस्टप प्रैक्टिस - एक स्ट्रिंग के पहले कैरेक्टर को लोअर केस में बदलना


136

मैं एक ऐसी विधि रखना चाहता हूं जो एक स्ट्रिंग के पहले चरित्र को निचले मामले में बदल देती है।

मेरा दृष्टिकोण:

1।

public static string ReplaceFirstCharacterToLowerVariant(string name)
{
    return String.Format("{0}{1}", name.First().ToString().ToLowerInvariant(), name.Substring(1));
}

2।

public static IEnumerable<char> FirstLetterToLowerCase(string value)
{
    var firstChar = (byte)value.First();
    return string.Format("{0}{1}", (char)(firstChar + 32), value.Substring(1));
}

आपका दृष्टिकोण क्या होगा?

जवाबों:


239

मैं सरल संयोजन का उपयोग करूंगा:

Char.ToLowerInvariant(name[0]) + name.Substring(1)

पहला समाधान अनुकूलित नहीं है क्योंकि string.Formatयह धीमा है और आपको इसकी आवश्यकता नहीं है यदि आपके पास एक प्रारूप है जो कभी नहीं बदलेगा। यह लोअरकेस को पत्र को गुप्त करने के लिए एक अतिरिक्त स्ट्रिंग भी उत्पन्न करता है, जिसकी आवश्यकता नहीं है।

"+ 32" के साथ दृष्टिकोण बदसूरत है / इसे बनाए रखने योग्य नहीं है क्योंकि इसके लिए ASCII वर्ण मूल्य ऑफसेट के ज्ञान की आवश्यकता है। यह यूनिकोड डेटा और ASCII प्रतीक वर्णों के साथ गलत आउटपुट भी उत्पन्न करेगा।


4
मैं यह करूंगा:char.ToLower(name[0]).ToString() + name.Substring(1)
एंड्री

7
@Rookian: +जब आप बहुत सारे तारों को समेट रहे हैं तो ऑपरेटर धीमा है। उस मामले में एक StringBuilderबहुत बेहतर प्रदर्शन करेगा। हालांकि, +की तुलना में बहुत तेज है string.Format। बाद का उपयोग करें जब आपको वास्तव में कुछ प्रारूपित करने की आवश्यकता होती है (जैसे पूर्णांक, युगल या दिनांक प्रदर्शित करना)।
डर्क वोल्मार

6
@ 0x03: यह तभी धीमा होता है जब आप बहुत सारे तार को पुनरावृत्त कर रहे हों। यदि आप एक ही ऑपरेशन में उन सभी को समेटते हैं, तो +ऑपरेटर बिल्कुल धीमा नहीं होता है, क्योंकि कंपाइलर इसे एक में बदल देता है String.Concat(हालांकि कुछ मूर्खतापूर्ण कारणों String.Joinसे तेज है String.Concat)।
थोरिन

2
एक तेज़ तरीका यह है: सार्वजनिक स्थैतिक स्ट्रिंग ToFirstLetterLower (स्ट्रिंग पाठ) {var charArray = text.ToCharArray (); charArray [0] = char.ToLower (charArray [0]); नई स्ट्रिंग लौटें (charArray); }
माटेयो मिग्लियोर

2
मैंने public static string ToLowerFirst(this string source) { if (string.IsNullOrWhiteSpace(source)) return source; var charArray = source.ToCharArray(); charArray[0] = char.ToLower(charArray[0]); return new string(charArray); } @ MatteoMigliore की टिप्पणी के आधार पर एक्सटेंशन का उपयोग किया ।
KregHEk

64

स्थिति के आधार पर, थोड़ा रक्षात्मक प्रोग्रामिंग वांछनीय हो सकता है:

public static string FirstCharacterToLower(string str)
{
    if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
        return str;

    return Char.ToLowerInvariant(str[0]) + str.Substring(1);
}

ifबयान में यह भी अगर यह वैसे भी परिवर्तित करने की नहीं हो रहा है निर्माण किया जा रहा से एक नई स्ट्रिंग से बचाता है। आप इसके बजाय अशक्त इनपुट पर विधि विफल होना चाहते हैं, और एक फेंक सकते हैं ArgumentNullException

जैसा कि लोगों ने उल्लेख किया है, इसके लिए उपयोग String.Formatओवरकिल है।


सही है अगर मैं गलत हूं, लेकिन str.Substring (1) स्थिति 1 पर प्रतीक वापस कर देगा क्योंकि इस पद्धति के लिए गिनती इंगित नहीं की गई है। इसलिए आपको लोअर केस में char [0] होगा + स्थिति 1 पर char तो मैंने स्ट्रिंग में पहले चार से शुरू होने वाले एक चार को हटाना पसंद किया। परिणाम पहले अक्षर के बिना स्ट्रिंग है। फिर मैं इस स्ट्रिंग को पहले चार में जोड़ दूंगा जिसे लोअर केस में बदल दिया गया है
खिलाया

3
@ बी बारिश: पर विचार अपने आप को सही: msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx
Thorarin

7

बस इस मामले में यह किसी को भी मदद करता है जो इस उत्तर को ठोकर मारता है।

मुझे लगता है कि यह एक विस्तार विधि के रूप में सबसे अच्छा होगा, फिर आप इसे अपने स्ट्रिंग के साथ कॉल कर सकते हैं। FirstCharacterToLower ();

public static class StringExtensions
{
    public static string FirstCharacterToLower(this string str)
    {
        if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
        {
            return str;
        }

        return Char.ToLowerInvariant(str[0]) + str.Substring(1);
    }
}

3

मेरा है

if (!string.IsNullOrEmpty (val) && val.Length > 0)
{
    return val[0].ToString().ToLowerInvariant() + val.Remove (0,1);   
}

3
मैं उत्सुक हूँ, क्यों val.Remove? मेरे लिए थोड़ा प्रति-सहज लगता है।
थोरिन

@Thorarin जाहिर है क्योंकि आप पहले चार को हटाना चाहते हैं (क्योंकि आप निचले मामले को संस्करण में जोड़ रहे हैं)
Riki

2

मुझे स्वीकृत उत्तर पसंद है, लेकिन string.IsNullOrEmptyजाँचने Char.IsLower(name[1])के साथ-साथ मैं यह भी जाँच करूँगा कि यदि आप संक्षिप्त नाम के साथ काम कर रहे हैं। उदाहरण के लिए, आप नहीं चाहेंगे कि "एड्स" "एड्स" बने।


8
IMO यह कॉल करने वाले की जिम्मेदारी है
onof

1

सबसे तेज़ उपाय जो मुझे पता है वो है गाली देना #:

public static string LowerCaseFirstLetter(string value)
{
    if (value?.Length > 0)
    {
        var letters = value.ToCharArray();
        letters[0] = char.ToLowerInvariant(letters[0]);
        return new string(letters);
    }
    return value;
}

0

कुछ को मिलाकर इसे एक श्रृंखलाबद्ध विस्तार बना दिया। व्हाट्सएप और नॉन लेटर पर शॉर्ट-सर्किट जोड़ा गया।

public static string FirstLower(this string input) => 
    (!string.IsNullOrWhiteSpace(input) && input.Length > 0 
        && char.IsLetter(input[0]) && !char.IsLower(input[0]))
    ? input[0].ToString().ToLowerInvariant() + input.Remove(0, 1) : input;

0

यह नवीनतम सिंटैक्स और सही सत्यापन का उपयोग करके थोड़ी विस्तार विधि है

public static class StringExtensions
{
    public static string FirstCharToLower(this string input)
    {
        switch (input)
        {
            case null: throw new ArgumentNullException(nameof(input));
            case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
            default: return input.First().ToString().ToLower() + input.Substring(1);
        }
    }
}

1
यकीन नहीं है कि अगर एक अपवाद फेंकना सबसे अच्छा समाधान होगा। क्या स्ट्रिंग शून्य या रिक्त है, बस रिक्त या रिक्त स्ट्रिंग लौटाएं।
आर। डे वीेन

यदि स्ट्रिंग शून्य या रिक्त है, तो ऑपरेशन से कोई मतलब नहीं है क्योंकि लोअरकेस में बदलने के लिए कोई पहला चार्ट नहीं है।
कार्लोस मुनोज

0

इसे इस्तेमाल करो:

string newName= name[0].ToString().ToLower() + name.Substring(1);

-3

इसका उपयोग करने String.Concatसे बेहतर है String.Formatकि यदि आप जानते हैं कि प्रारूप डेटा नहीं बदल रहा है, और सिर्फ सहमति वांछित है।

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