स्ट्रिंग वर्ग में कौन सी विधि केवल पहले N अक्षर लौटाती है?


184

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

यहां बताया गया है कि यह कैसा दिखता है:

public static string TruncateLongString(this string str, int maxLength)
{
    if (str.Length <= maxLength)
        return str;
    else
        //return the first maxLength characters                
}

String.*()केवल पहले Nअक्षर को प्राप्त करने के लिए मैं किस विधि का उपयोग कर सकता हूं str?

जवाबों:


374
public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str))
        return str;
    return str.Substring(0, Math.Min(str.Length, maxLength));
}

6
गणित की जरूरत है। मुझे लगा कि सबस्ट्रिंग को पता था कि अगर दूसरा पैरामीटर लंबाई से अधिक था, तो यह सिर्फ लंबाई में प्लग किया गया था?
मार्टिन

12
मेरा मानना ​​है कि यह है: System.String.InternalSubStringWithChecks ArgumentOutOfRange फेंक देंगे।
पॉल रूआन

2
@ मरीन: ऐसा नहीं है कि मैं देख सकता हूं, startIndex > (this.Length - length)फेंकता है ArgumentOutOfRangeException
14:7 बजे user7116

2
मैं जाँच करने जा रहा था कि यदि Math.Min(str.Length, maxLength) == str.Lengthआप "पहले str .Length वर्ण के" को वापस करने के लिए अनावश्यक स्ट्रिंग बनाते हैं, तो जाँच करने जा रहा है , लेकिन सबस्ट्रिंग उस चेक को आपके लिए करता है और return thisयदि आपने पूरे स्ट्रिंग के लिए कहा है तो।
स्टीववेगसन

2
यदि आप चाहते हैं कि एक्सटेंशन विधि संभवत: अशक्त स्ट्रिंग्स पर काम करे ... वापसी str? (Substring (0, Math.Min (str.Length, maxLength));
जुने

62
string truncatedToNLength = new string(s.Take(n).ToArray());  

इस समाधान में एक छोटा सा बोनस है अगर n s से अधिक है। यह अभी भी सही काम करता है।


9
हाँ, लेकिन एक स्ट्रिंग को कम करने के लिए Linq का उपयोग कर रहे हैं? बस जागरूक रहें यह बहुत बुरी तरह से प्रदर्शन करेगा यदि कई बार उपयोग किया जाता है जैसे कि एक लूप में। इसे आदत के रूप में मत करो
एरिक

31

आप LINQ का उपयोग कर सकते हैं str.Take(n)या str.SubString(0, n), जहाँ बाद वाले ArgumentOutOfRangeExceptionइसके लिए अपवाद छोड़ देंगे n > str.Length

ध्यान रखें कि LINQ संस्करण एक रिटर्न IEnumerable<char>, तो आप परिवर्तित करना होगा IEnumerable<char>करने के लिए string: new string(s.Take(n).ToArray())


10
तार को छोटा करने के लिए लाइनक का उपयोग न करें। क्या बकवास है।
एरिक

17

जब भी मुझे C # में स्ट्रिंग मैनिपुलेशन करना होता है, तो मैं अच्छे पुराने को याद करता हूं Leftऔर RightVisual Basic से कार्य करता हूं , जो कि उपयोग करने के लिए बहुत सरल हैं Substring

इसलिए मेरी अधिकांश C # परियोजनाओं में, मैं उनके लिए विस्तार विधियाँ बनाता हूँ:

public static class StringExtensions
{
    public static string Left(this string str, int length)
    {
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - Math.Min(length, str.Length));
    }
}

नोट: भाग नहीं है क्योंकि एक फेंकता है जब इनपुट स्ट्रिंग की लंबाई पहले से ही पिछले जवाब के तहत कुछ टिप्पणियों में उल्लेख किया है के रूप में अनुरोध लंबाई से छोटी है,।
Math.MinSubstringArgumentOutOfRangeException

उपयोग:

string longString = "Long String";

// returns "Long";
string left1 = longString.Left(4);

// returns "Long String";
string left2 = longString.Left(100);

मुझे यह पसंद है, लेकिन यदि स्ट्रिंग दी गई लंबाई से छोटी थी, तो यह रिक्त स्थान को जोड़ नहीं पाएगी। public static string Left(this string str, int length) { var Result = str.Substring(0, Math.Min(length, str.Length)); return (Result.Length < length) ? Result.PadRight(length) : Result; }
ग्रैंडर

strnull
liviriniu

14

सीधे शब्दों में:

public static String Truncate(String input,int maxLength)
{
   if(input.Length > maxLength)
      return input.Substring(0,maxLength);
   return input;
}

7
public static string TruncateLongString(this string str, int maxLength)
{
    return str.Length <= maxLength ? str : str.Remove(maxLength);
}

1
इसके अलावा, ध्यान दें कि आप स्थिति बदलने के लिए विस्तार विधि को शून्य-सुरक्षित भी बना सकते हैंstr == null || str.Length <= maxLength
kbrimington

6
सोच रहा है कि क्या किसी के लिए Removeया Substringबेहतर है, वहाँ कोई अंतर नहीं है। Remove(maxLength)बस Substring(0,maxLength)थोड़ी सी जाँच के बाद कॉल करता है । जिसे आप पसंद करते हैं वह इस बात पर निर्भर करता है कि क्या आप ट्रंकेशन के बारे में सोचते हैं कि "पहले अधिकतम लाइब्रेटर वर्ण लें" या "अधिकतम वर्ण के बाद सब कुछ फेंक दें"। बेशक, यह वास्तव में दोनों है इसलिए यह आपके ऊपर है।
स्टीवमेगसन

5

अगर हम मान्यताओं के बारे में भी बात कर रहे हैं तो हमने अशक्त स्ट्रिंग प्रविष्टियों के लिए जाँच क्यों नहीं की है। कोई खास कारण?

मुझे लगता है कि इस तरह से मदद के बाद से नीचे है क्योंकि IsNullOrEmpty एक प्रणाली परिभाषित विधि है और टर्नरी ऑपरेटरों के पास साइक्लोमैटिक जटिलता = 1 है जबकि अगर () {} और {} का मान 2 है।

    public static string Truncate(string input, int truncLength)
    {
        return (!String.IsNullOrEmpty(input) && input.Length >= truncLength)
                   ? input.Substring(0, truncLength)
                   : input;
    }

चक्रवाती जटिलता 2 के साथ एक मुद्दा क्या है?
मुफ्लिक्स

1

मैंने इसे अपने प्रोजेक्ट में सिर्फ इसलिए जोड़ा क्योंकि जहाँ मैं इसका उपयोग कर रहा हूँ, यह एक उच्च संभावना है कि इसका उपयोग लूप्स में किया जा रहा है, एक ऑनलाइन होस्ट की गई परियोजना में, इसलिए मैं नहीं चाहता था कि मैं इसे प्रबंधित कर सकूं। लंबाई मेरे पास एक कॉलम फिट बैठता है। यह C # 7 है

बस एक लाइन:

 public static string SubStringN(this string Message, int Len = 499) => !String.IsNullOrEmpty(Message) ? (Message.Length >= Len ? Message.Substring(0, Len) : Message) : "";

0

.NET सब्सट्रिंग विधि जोखिम के साथ भरा है। मैंने विस्तार विधियाँ विकसित कीं जो विविध प्रकार के परिदृश्यों को संभालती हैं। अच्छी बात यह है कि यह मूल व्यवहार को संरक्षित करता है, लेकिन जब आप एक अतिरिक्त "सच" पैरामीटर जोड़ते हैं, तो यह अपवाद को संभालने के लिए विस्तार विधि का समर्थन करता है, और सूचकांक और लंबाई के आधार पर सबसे तार्किक मान देता है। उदाहरण के लिए, यदि लंबाई ऋणात्मक है, और पीछे की ओर गिना जाता है। आप परीक्षण के परिणामों को फिडल पर विभिन्न प्रकार के मूल्यों के साथ देख सकते हैं: https://dotnetfiddle.net/m1mSH9 । यह आपको इस बात पर स्पष्ट विचार देगा कि यह किस तरह से सबस्ट्रिंग को हल करता है।

मैं हमेशा अपनी सभी परियोजनाओं में इन तरीकों को जोड़ता हूं, और कोड ब्रेकिंग के बारे में कभी भी चिंता करने की ज़रूरत नहीं है, क्योंकि कुछ बदल गया है और सूचकांक अमान्य है। नीचे कोड है।

    public static String Substring(this String val, int startIndex, bool handleIndexException)
    {
        if (!handleIndexException)
        { //handleIndexException is false so call the base method
            return val.Substring(startIndex);
        }
        if (string.IsNullOrEmpty(val))
        {
            return val;
        }
        return val.Substring(startIndex < 0 ? 0 : startIndex > (val.Length - 1) ? val.Length : startIndex);
    }

    public static String Substring(this String val, int startIndex, int length, bool handleIndexException)
    {
        if (!handleIndexException)
        { //handleIndexException is false so call the base method
            return val.Substring(startIndex, length);
        }
        if (string.IsNullOrEmpty(val))
        {
            return val;
        }
        int newfrom, newlth, instrlength = val.Length;
        if (length < 0) //length is negative
        {
            newfrom = startIndex + length;
            newlth = -1 * length;
        }
        else //length is positive
        {
            newfrom = startIndex;
            newlth = length;
        }
        if (newfrom + newlth < 0 || newfrom > instrlength - 1)
        {
            return string.Empty;
        }
        if (newfrom < 0)
        {
            newlth = newfrom + newlth;
            newfrom = 0;
        }
        return val.Substring(newfrom, Math.Min(newlth, instrlength - newfrom));
    }

मैंने मई 2010 में इस बारे में वापस ब्लॉग किया: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html


0

संक्षेप में संक्षेप के लिए (LINQ समाधान को छोड़कर), यहां दो वन-लाइनर्स हैं जो int maxLengthनकारात्मक मानों की अनुमति के चेतावनी को संबोधित करते हैं और अशक्त स्ट्रिंग के मामले में भी:

  1. जिस Substringतरह से ( पॉल Ruane के जवाब से ):
public static string Truncate(this string s, uint maxLength) =>
    s?.Substring(0, Math.Min(s.Length, (int)maxLength));
  1. Removeजिस तरह से (से kbrimington का जवाब ):
public static string Truncate(this string s, uint maxLength) =>
    s?.Length > maxLength ? s.Remove((int)maxLength) : s;


-4

string.Substring (0, एन); // 0 - प्रारंभ सूचकांक और n - वर्णों की संख्या


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