2015-10-20 16 views
24

सी # 6 वाक्य रचना के साथ अंतर्वेशित स्ट्रिंग शाब्दिक के लिए संकलक समर्थन लाता है:बहुपंक्ति सी # अंतर्वेशित स्ट्रिंग शाब्दिक

var person = new { Name = "Bob" }; 

string s = $"Hello, {person.Name}."; 

इस छोटे तार के लिए अच्छा है, लेकिन अगर आप एक लंबी स्ट्रिंग का उत्पादन करना चाहते हैं यह एक एकल पर निर्दिष्ट किया जाना चाहिए लाइन?

तार के अन्य प्रकार के साथ

आप कर सकते हैं:

var multi1 = string.Format(@"Height: {0} 
Width: {1} 
Background: {2}", 
     height, 
     width, 
     background); 

या:

var multi2 = string.Format(
    "Height: {1}{0}" + 
    "Width: {2}{0}" + 
    "Background: {3}", 
    Environment.NewLine, 
    height, 
    width, 
    background); 

मैं यह सब एक के बाद एक लाइन बिना स्ट्रिंग प्रक्षेप के साथ इस लक्ष्य को हासिल करने के लिए एक तरह से नहीं मिल सकता है:

var multi3 = $"Height: {height}{Environment.NewLine}Width: {width}{Environment.NewLine}Background: {background}"; 

मुझे लगता है कि इस मामले में आपके स्थान पर \r\n इस्तेमाल कर सकते हैं(कम पोर्टेबल), या इसे स्थानीय में खींचें, लेकिन ऐसे मामले होंगे जहां आप इसे कम से कम एक पंक्ति से कम नहीं कर सकते हैं, बिना अर्थपूर्ण ताकत खोए।

क्या यह केवल मामला है कि स्ट्रिंग इंटरपोलेशन लंबे तारों के लिए उपयोग नहीं किया जाना चाहिए?

क्या हमें लंबे समय तक StringBuilder का उपयोग करना चाहिए?

var multi4 = new StringBuilder() 
    .AppendFormat("Width: {0}", width).AppendLine() 
    .AppendFormat("Height: {0}", height).AppendLine() 
    .AppendFormat("Background: {0}", background).AppendLine() 
    .ToString(); 

या क्या कुछ और सुरुचिपूर्ण है?

+6

http://stackoverflow.com/questions/31764898/long-string-interpolation-lines-in-c6 – Ric

+0

@ डेमेट्रोशेवचेन्को, मैंने ऐसा करने पर विचार किया। हालांकि, मुझे आपकी स्वीकृति के बारे में निश्चित नहीं था क्योंकि मैंने देखा कि आपने [शीर्ष मतदान वाले उत्तर] (http://stackoverflow.com/a/31764920/24874) को कॉपी किया है, जिस लिंक को रिक पोस्ट किया गया है, फिर इसे अलग देखने के लिए संपादित करें । यह सब 5 मिनट के भीतर हुआ, इसलिए संपादन दिखाई नहीं दे रहे हैं। आपका जवाब तकनीकी रूप से सही है, लेकिन मुझे लगा जैसे आपको क्रेडिट देना चाहिए था। मैं वास्तव में रिक की टिप्पणी स्वीकार करना चाहूंगा, लेकिन यह संभव नहीं है। –

+0

@DrewNoakes आपका प्रश्न रिक द्वारा लिखे गए प्रश्न के डुप्लिकेट के रूप में चिह्नित किया गया है। रिक वह था जिसने इसे चिह्नित किया। इसलिए मेरे उत्तर के उस लिंक का एक और उदाहरण जोड़ने की कोई ज़रूरत नहीं है। यदि आप असहमत हैं, तो मैं आपकी तर्क की सराहना करता हूं। और निश्चित रूप से मैंने अपने जवाब में कोड संपादित किया। हालांकि, इसका कारण यह अलग दिखना नहीं था, बल्कि आपके प्रश्न में उदाहरण से मेल खाना था। –

उत्तर

49

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

string s = 
[email protected]"Height: {height} 
Width: {width} 
Background: {background}"; 

स्रोत: Long string interpolation lines in C#6 (धागा को खोजने के लिए @Ric के लिए धन्यवाद!)

+1

मैंने इसे @ $ (उलट दिया) के रूप में आजमाया था और यह काम नहीं किया था इसलिए मुझे लगा कि उन्हें संयुक्त नहीं किया जा सका। यह दूसरी तरफ कोशिश करने के लिए मेरे पास नहीं हुआ था। – kencordero

2

मैं शायद एक संयोजन का उपयोग करें

var builder = new StringBuilder() 
    .AppendLine($"Width: {width}") 
    .AppendLine($"Height: {height}") 
    .AppendLine($"Background: {background}"); 
+0

क्या डाउनवॉटर कोई अंतर्दृष्टि दे सकता है? मुझे इसके साथ कोई समस्या नहीं दिख रही है, क्या कोई समस्या है? – kai

+0

रिकॉर्ड के लिए मैंने वास्तव में आपको ऊपर उठाया। ऐसे मामले हो सकते हैं जहां यह अधिक पठनीय है। एकमात्र नकारात्मक मैं सोच सकता हूं कि यह जीसी के लिए कुछ अतिरिक्त वस्तुएं बना रहा है। –

+0

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

0

व्यक्तिगत रूप से, मैं सिर्फ स्ट्रिन का उपयोग करके एक और इंटरपोलेटेड स्ट्रिंग जोड़ता हूं जी संयोजन

उदाहरण

var multi = $"Height  : {height}{Environment.NewLine}" + 
      $"Width  : {width}{Environment.NewLine}" + 
      $"Background : {background}"; 

के लिए मुझे लगता है कि स्वरूपित और पढ़ने में आसान है।

यह $ @ "" का उपयोग करने के मुकाबले अतिरिक्त ओवरहेड होगा लेकिन केवल सबसे प्रदर्शन महत्वपूर्ण अनुप्रयोगों में यह ध्यान देने योग्य होगा। मेमोरी स्ट्रिंग ऑपरेशंस में डेटा I/O की तुलना में बेहद सस्ते हैं। डीबी से एक एकल चर पढ़ने से ज्यादातर मामलों में सैकड़ों गुना अधिक समय लगेगा।

संबंधित मुद्दे