स्ट्रिंग लिटरल में न्यूलाइन कैसे डालें?


155

.NET में, मैं दोनों \rया \nस्ट्रिंग शाब्दिक प्रदान कर सकता हूं , लेकिन "नई लाइन" जैसे कुछ विशेष गुण को Environment.NewLineस्थैतिक संपत्ति की तरह सम्मिलित करने का एक तरीका है ?


9
प्रश्न क्या है?
iburlakov

जवाबों:


319

खैर, सरल विकल्प हैं:

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • स्ट्रिंग संघनन:

    string x = "first line" + Environment.NewLine + "second line";
  • स्ट्रिंग प्रक्षेप (सी # 6 और ऊपर में):

    string x = $"first line{Environment.NewLine}second line";

आप भी हर जगह \ n का उपयोग कर सकते हैं, और प्रतिस्थापित कर सकते हैं:

string x = "first line\nsecond line\nthird line".Replace("\n",
                                                         Environment.NewLine);

ध्यान दें कि आप इसे एक स्ट्रिंग स्थिर नहीं बना सकते , क्योंकि इसका मूल्य Environment.NewLineनिष्पादन के समय ही उपलब्ध होगा।


1
ठीक है, निश्चित रूप से धन्यवाद, लेकिन मेरा मतलब पर्यावरण का उपयोग करने से बचना था। न्यूलाइन, मेरा सवाल था कि क्या '/' न्यूलाइन 'शाब्दिक है।
कप्तान कॉमिक

2
@Captain: आप क्यों बचना Environment.NewLineचाहते हैं? इसके विपरीत, इसका उपयोग करने के लिए यह एक अच्छा अभ्यास है
abatishchev

18
@abatishchev: कुछ स्थानों पर यह अच्छा अभ्यास है। मेरे दूसरों में यह नहीं है। आपको वास्तव में यह जानना होगा कि आप प्लेटफॉर्म-विशिष्ट का उपयोग करना चाहते हैं। उदाहरण के लिए, यह एक अच्छा विचार नहीं है यदि आप एक नेटवर्क प्रोटोकॉल का उपयोग कर रहे हैं जिसे लाइन टर्मिनेटर को स्वयं परिभाषित करना चाहिए।
जॉन स्कीट

1
@ कैप्टेन कॉमिक: मेरा अंतिम वाक्य बताता है कि यह शाब्दिक पलायन क्यों नहीं हो सकता है - आप इसे एक स्ट्रिंग स्थिरांक के लिए मेटाडेटा में शामिल नहीं कर सकते, क्योंकि यह एक निरंतर मूल्य नहीं है।
जॉन स्कीट

1
हाँ, मैं अनिच्छुक हो सकता हूं क्योंकि दोनों विकल्प हैं: एक प्लस ऑपरेटर का उपयोग करना और दूसरा प्रारूप विधि का उपयोग करना काफी ओवरहेड है जहां '\ newline' शाब्दिक रूप से इंजेक्ट करना सबसे तेज़ तरीका होगा। लेकिन जैसा कि जॉन ने कहा कि न्यूलाइन शाब्दिक है अगर अस्तित्व में गतिशील और मंच पर निर्भर रहना होगा।
कप्तान कॉमिक

33

यदि आप एक कास्ट स्ट्रिंग चाहते हैं जिसमें एनवायरनमेंट शामिल है। इसमें न्यूलाइन आप कुछ इस तरह से कर सकते हैं:

const string stringWithNewLine =
@"first line
second line
third line";

संपादित करें

चूंकि यह एक कास्ट स्ट्रिंग में है, इसलिए इसे संकलन समय में किया जाता है इसलिए यह एक नई पंक्ति के संकलक की व्याख्या है। मैं इस व्यवहार की व्याख्या करते हुए एक संदर्भ नहीं ढूंढ सकता, लेकिन, मैं यह साबित कर सकता हूं कि यह काम करता है। मैंने इस कोड को विंडोज और उबंटू दोनों पर संकलित किया है (मोनो के साथ) फिर असंतुष्ट और ये परिणाम हैं:

विंडोज पर जुदा उबुन्टु पर जुदा

जैसा कि आप देख सकते हैं, विंडोज में न्यूलाइन्स को \ n के रूप में और Ubuntu पर \ n के रूप में व्याख्या की जाती है


1
कंपाइलर पाठ में प्रत्येक पंक्ति के बीच अपने आप एक एनवायरन.न्यूलाइन जोड़ता है। तो स्ट्रिंग की व्याख्या इस प्रकार की जाती है: "पहली पंक्ति" + पर्यावरण.न्यूलाइन + "दूसरी पंक्ति" + पर्यावरण.नई लाइन + "तीसरी पंक्ति"
ताल जेरोम

3
+1 लिटरेचर स्ट्रिंग स्ट्रिंग में न्यूलाइन डालने का छोटा ज्ञात तरीका। क्या आपके द्वारा निर्दिष्ट व्यवहार के लिए कोई संदर्भ है? क्या यह वास्तव में एनवायरनमेंट है। न्यूलाइन या यह एक नई पंक्ति की संकलक परिभाषा है?
डेसपेयर का ग्रास डेस

1
क्या आप सुनिश्चित हैं कि यह कोड संपादक की नई पंक्ति वर्ण नहीं है जो वहां डाला गया है? यदि आप उस कोड को विंडोज़ पर एक संपादक में कॉपी-पेस्ट करते हैं, तो यह संभवतः \ r \ n में परिवर्तित हो जाएगा। यूनिक्स जैसे प्लेटफ़ॉर्म पर भी ऐसा ही करें और यह संभवत: इसके बजाय \ n में परिवर्तित हो जाएगा।
15 अक्टूबर को शीआनग

इसके साथ वॉच-आउट। यदि आप CI / CD सर्वर (जैसे टीमसिटी, सर्वर साइड चेकआउट) पर कोड चेक करते हैं तो यह CRLF को LF में बदल देगा और स्ट्रिंग में नई लाइनें नहीं होंगी।
लेसजेक पी

13
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();

2
ऐसा करने के बजाय आप ऐसा क्यों करेंगे first + Environment.NewLine + secondजो अधिक कुशल और (IMO) पढ़ने में आसान है?
जॉन स्कीट

@ जॉन: अधिक कुशल, वास्तव में? मैंने सोचा था कि String.Formatएक ही बार में 1 स्ट्रिंग का उत्पादन होगा (लेकिन यह आंतरिक रूप से थोड़ा धीमा है क्योंकि संस्कृति विशिष्ट संघनन, आदि), जबकि स्ट्रिंग संघात - 1 परिणामस्वरूप + 1 अस्थायी, सही?
abatishchev

1
@abatishchev: कंपाइलर str + str + str को कंवर्ट करता है String.Concatenate, जो सीधे सिर्फ एक आउटपुट स्ट्रिंग (IIRC बनाता है, यदि स्ट्रिंग्स शाब्दिक हैं तो कंपाइलर में कंसैशन किया जाता है।
रिचर्ड

@ रीचर्ड: "a"+b+"c"+dप्रदर्शन के आधार पर एक से अधिक लेकिन एक-पंक्ति स्ट्रिंग संघनन ( , आदि) एक एकल के बराबर हैं? या सिर्फ करने के लिए परिवर्तित String.Concatenate(a,b,c,d,etc), सही?
abatishchev

@abatishchev: इसीलिए मैंने string.Formatटिप्पणी में सुझाव नहीं दिया । स्ट्रिंग संघनन किसी भी अस्थायी तार का उत्पादन नहीं करेगा, क्योंकि कंपाइलर कॉल करेगा string.Concat(first, Environment.NewLine, second)
जॉन स्कीट

3

पर्यावरण के सुविधाजनक प्लेसमेंट का एक और तरीका है। प्रारूप स्ट्रिंग में नई लाइन। यह विचार स्ट्रिंग विस्तार विधि बनाने का है जो सामान्य रूप से स्ट्रिंग को प्रारूपित करता है, लेकिन पर्यावरण के साथ पाठ में {nl} को प्रतिस्थापित करता है

प्रयोग

   " X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
   gives:
    X=1
    Y=2
    X+Y=3

कोड

    ///<summary>
    /// Use "string".FormatIt(...) instead of string.Format("string, ...)
    /// Use {nl} in text to insert Environment.NewLine 
    ///</summary>
    ///<exception cref="ArgumentNullException">If format is null</exception>
    [StringFormatMethod("format")]
    public static string FormatIt(this string format, params object[] args)
    {
        if (format == null) throw new ArgumentNullException("format");

        return string.Format(format.Replace("{nl}", Environment.NewLine), args);
    }

ध्यान दें

  1. यदि आप चाहते हैं कि ReSharper आपके मापदंडों को उजागर करे, तो उपरोक्त विधि में विशेषता जोड़ें

    [StringFormatMethod ( "प्रारूप")]

  2. यह कार्यान्वयन स्पष्ट रूप से सिर्फ स्ट्रिंग.फॉर्मट की तुलना में कम कुशल है

  3. शायद एक, जो इस सवाल में रुचि रखते हैं, अगले सवाल में भी दिलचस्पी होगी: C # में नामित स्ट्रिंग स्वरूपण


2
string myText =
    @"<div class=""firstLine""></div>
      <div class=""secondLine""></div>
      <div class=""thirdLine""></div>";

बस ऐसा नहीं है:

string myText =
@"<div class=\"firstLine\"></div>
  <div class=\"secondLine\"></div>
  <div class=\"thirdLine\"></div>";

1
static class MyClass
{
   public const string NewLine="\n";
}

string x = "first line" + MyClass.NewLine + "second line"

3
-1: सिस्टम पहले से ही परिभाषित करता है Environment.NewLine- अन्य उत्तर देखें।
रिचर्ड

@ रिचर्ड: ओपी, जहां तक ​​मैं उसे समझ सकता था, इनconst string
लाइन

@

1

नए .net संस्करण आपको शाब्दिक के सामने $ का उपयोग करने की अनुमति देते हैं जो आपको निम्न प्रकार के अंदर चर का उपयोग करने की अनुमति देता है:

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";

1
थोड़ा सा संदर्भ बुरा नहीं होगा।
croxy

1
यह प्रश्न का उत्तर प्रदान नहीं करता है। एक बार आपके पास पर्याप्त प्रतिष्ठा होने पर आप किसी भी पोस्ट पर टिप्पणी करने में सक्षम होंगे ; इसके बजाय, ऐसे उत्तर प्रदान करें जिन्हें पूछने वाले से स्पष्टीकरण की आवश्यकता न हो । - समीक्षा से
एच। पॉवेलियन

@ H.Pauwelyn ely: प्रतिक्रिया के लिए Thx। मैंने थोड़ा सा संदर्भ जोड़ा। मेरे दृष्टिकोण से समाधान निश्चित रूप से प्रश्न का उत्तर देता है।
डैनियल सिप

0

यदि आप वास्तव में एक निरंतरता के रूप में नई लाइन स्ट्रिंग चाहते हैं, तो आप ऐसा कर सकते हैं:

public readonly string myVar = Environment.NewLine;

C # में रीडोनॉली कीवर्ड के उपयोगकर्ता का अर्थ है कि यह चर केवल एक बार सौंपा जा सकता है। आप इस पर दस्तावेज़ीकरण देख सकते हैं यहां । यह एक स्थिर चर की घोषणा की अनुमति देता है जिसका मूल्य निष्पादन समय तक ज्ञात नहीं है।


0

मुझे "पाइथोनिक तरीका" अधिक पसंद है

List<string> lines = new List<string> {
    "line1",
    "line2",
    String.Format("{0} - {1} | {2}", 
        someVar,
        othervar, 
        thirdVar
    )
};

if(foo)
    lines.Add("line3");

return String.Join(Environment.NewLine, lines);

0

यदि आप वेब एप्लिकेशन के साथ काम कर रहे हैं तो आप यह कोशिश कर सकते हैं।

StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")

0

अगर मैं इस प्रश्न को समझता हूं: युगल "\r\n"को उस नई लाइन को नीचे लाने के लिए textbox। मेरे उदाहरण ने काम किया -

   string s1 = comboBox1.Text;     // s1 is the variable assigned to box 1, etc.
   string s2 = comboBox2.Text;

   string both = s1 + "\r\n" + s2;
   textBox1.Text = both;

एक विशिष्ट उत्तर परिभाषित प्रकार शैली का उपयोग करने s1 s2 में हो सकता है text box


-1

यहाँ, पर्यावरण। नया काम नहीं करता है।

मैं डाल एक " < br / > " एक स्ट्रिंग में और काम किया।

उदाहरण के लिए:

ltrYourLiteral.Text = "पहली पंक्ति। <br /> दूसरी पंक्ति।";

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