C # 6 में लंबी स्ट्रिंग प्रक्षेप रेखाएँ


134

मैंने पाया है कि आमतौर पर पसंदीदा कॉलम सीमा को देखते हुए, मेरे मौजूदा कोड बेस के स्ट्रिंग फॉर्मेट कॉल्स पर लागू होने पर स्ट्रिंग इंटरपोलेशन बहुत अच्छा होता है, स्ट्रिंग तेजी से सिंगल लाइन के लिए बहुत लंबी हो जाती है। खासकर तब जब अभिव्यक्तियाँ जटिल हो रही हों। एक प्रारूप स्ट्रिंग के साथ आपके पास चर की एक सूची है जिसे आप कई लाइनों में विभाजित कर सकते हैं।

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

क्या किसी के पास इन पंक्तियों को तोड़ने का कोई पसंदीदा तरीका है?

मुझे लगता है कि आप कुछ ऐसा कर सकते हैं:

var str = $"some text { obj1.property }" +
  " more text { obj2.property };

1
मेरे अनुभव में यह जटिल अभिव्यक्तियों को टालने से बेहतर है। बल्कि उस मामले में एक चर निकालें। यदि आप ऐसा करते हैं, और आप टूट जाते हैं, जहां आपके तार के अंदर नई रेखाएं हैं, तो यह आम तौर पर ठीक होगा।
चिह्न

2
मैं इस सवाल से उलझन में हूँ। मैं सिर्फ एक बहु की $""तरह काम करता हूं जो कि काम करता है@""
कर्नल पैनिक

2
कर्नल पैनिक, सवाल यह पूछ रहा है कि लंबी प्रक्षेप रेखाओं को कैसे तोड़ना है ताकि हम स्तंभ की चौड़ाई की आवश्यकताओं का उल्लंघन न करें, बिना स्ट्रिंग के शाब्दिक रूप में स्वयं को प्रस्तुत किए। $ @ "" महान है, लेकिन इसमें पेश की गई कोई भी नई कहानी स्ट्रिंग शाब्दिक में होगी।
यिर्मयाह गौडी

4
खतरे: $"some text { obj1.property }" + " more text { obj2.property }";ऐसा नहीं है जो आपको लगता है कि यह करता है। उस अभिव्यक्ति का केवल पहला आधा एक प्रक्षेपित स्ट्रिंग है; इसके बाद गैर- अंतर्वृत्त स्ट्रिंग शाब्दिक के साथ सम्‍मिलित है" more text { obj2.property }"
बेकर

1
$ @ में \ t \ r \ n का समर्थन करने के लिए @ सवाल देखें stackoverflow.com/questions/51991713/…
M.Hassan

जवाबों:


198

आप लाइन को कई लाइनों में तोड़ सकते हैं, लेकिन मैं यह नहीं कहूंगा कि वाक्यविन्यास किसी भी अधिक अच्छा लग रहा है।

आपको $@एक प्रक्षेपवश वर्बटीम स्ट्रिंग का उपयोग करने के लिए सिंटैक्स का उपयोग करने की आवश्यकता है , और आप {...}मापदंडों को अंदर की तरह नया कर सकते हैं , जैसे:

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

ऊपर दिए गए तार में कोई नया अंक नहीं होगा और वास्तव में इस तरह की सामग्री होगी:

यह सभी 10 एक लंबी 01.08.2015 से 23.49.47 लाइन पर जा रहे हैं।

(नोट, प्रेमिका प्रारूप)

अब, यह कहते हुए कि, मैंने उपयोग करना बंद नहीं किया string.Format। मेरी राय में इनमें से कुछ स्ट्रिंग इंटरप्रेशन एक्सप्रेशन बहुत अच्छे लगते हैं, लेकिन अधिक जटिल लोगों को पढ़ना बहुत मुश्किल होने लगता है। यह देखते हुए कि जब तक आप उपयोग नहीं करते हैं FormattableString, कोड को किसी String.Formatभी तरह से कॉल में संकलित किया जाएगा, मैं कहूंगा कि String.Formatजहां यह समझ में आता है, उसके साथ चलते रहेंगे ।


ठोस जवाब। मुझे पूरा यकीन है कि FormattableStringएक फोन करने के लिए String.Formatभी उबलते हैं।
एलेक्स बुकर

8
इस जवाब ने मुझे यह पता लगाने में मदद की कि इसके ठीक विपरीत कैसे किया जाए। $@""वाक्य रचना के लिए धन्यवाद !
बोबसन

@AlexBooker यह उससे कहीं अधिक जटिल है। आप ऐसा नहीं कर सकते FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");क्योंकि यह दो प्रक्षेपित तारों को एक साधारण स्ट्रिंग में मिला देता है।
एनेव्स

इंटरपोलिटेड वर्बेटिम स्ट्रिंग्स में न्यूलाइन्स और टैब का सम्मान किया जाता है। निम्नलिखित को C # इंटरैक्टिव विंडो में दर्ज करें और परिणामी स्ट्रिंग को स्वरूपित किया जाएगा:। > var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output। आउटपुट है"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas

1
@Enzoaeneas मुझे लगता है कि आपने टिप्पणियों में स्वरूपण समर्थन को ओवरराइड किया है, लेकिन मैं समझ रहा हूं और आप जो कह रहे हैं उससे सहमत हैं।
लास वी। कार्लसन

61

आप को जोड़ सकते हैं $और @एक साथ स्ट्रिंग प्रक्षेप और बहु-पंक्ति स्ट्रिंग शाब्दिक पाने के लिए:

var str = $@"some text { obj1.property }
     more text { obj2.property }";

लेकिन यह आपको NewLineबीच में एक चरित्र देगा , इसलिए यह वह नहीं हो सकता जो आप चाहते हैं।


3
लेकिन @ वास्तव में लाइन फ़ीड शाब्दिक में नहीं डाला है?
यिर्मयाह गौडी

5
ऐसा होता है। स्पष्ट रूप से कहने के लिए मेरे उत्तर को अपडेट करें।
MarcinJuraszek

न केवल एक नई लाइन, बल्कि नई लाइन का प्रारंभिक टैब भी। $@"दृश्य स्टूडियो में उपयोग करते समय वास्तविक स्ट्रिंग प्रारूप को सही ढंग से चित्रित करने के लिए आपको पाठ संपादक के सबसे बाईं ओर से प्रत्येक नई पंक्ति शुरू करनी होगी।
जीडीएस

इस समाधान के साथ आप स्ट्रिंग में eg \ r और \ n का उपयोग नहीं कर सकते हैं
जोहान फ्रेंज़ेन

22

जबकि ओपी ने कुछ और मांगा, मुझे उम्मीद है कि इस सवाल को पढ़ रहे कई लोग एक बहु-प्रक्षेपित $""चाहेंगे जो काम करता है @""। ऐसा करने के लिए, का उपयोग करें$@""

$@"Height: {height}
Width: {width}
Background: {background}"

3
वह आउटपुट में
नए अंक

7
उन्होंने यह स्पष्ट किया कि यह उत्तर उन दर्शकों के लिए था जो स्ट्रिंग इंटरपोलेशन सिंटैक्स का उपयोग करके बहु-स्तरीय तारों की खोज करने के लिए आते हैं।
ब्रैंडन बॉन्ड्स

2

यह बात है:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

दूसरे $में नोट करें$"..." + $"..."


18
ध्यान दें कि यह String.Format को दो कॉल करेगा और मेमोरी में तीन स्ट्रिंग्स भी बनाएगा (साइड ए, साइड बी, और ए + बी)
केविन कालिटोव्स्की

1
क्या यह आपको FormattableStringकॉन्टेक्टेड स्ट्रिंग पर एक कास्ट का उपयोग करने से नहीं रोकेगा ?
बिंकी जू

4
आज कई कार्यान्वयन में, Gb की मेमोरी के साथ GHz CPU पर चलने पर, एक अतिरिक्त कॉल और एक अतिरिक्त स्ट्रिंग आपको प्रदर्शन की समस्या नहीं देगा। O (n2) के एक एल्गोरिथ्म का उपयोग करके प्रदर्शन की समस्याओं का कारण होगा। मुझे लगता है कि इस आदमी को नीचा दिखाना अनुचित है।
जोहान फ्रेंजेन

1

मैंने एक उदाहरण के रूप में ओवरराइड टोस्ट्रिंग () के भीतर स्ट्रिंजबर्ल का उपयोग किया है।

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }

फिर क्यों नहीं buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.