C # 6 में स्ट्रिंग इंटरपोलेशन के साथ एस्केप कैरेक्टर्स का उपयोग कैसे करें?


86

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

मुझे जो चाहिए वो कुछ इस तरह है ।।

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\{userName}"

मैं चाहता हूं कि कॉम्बो का आउटपुट हो

myDomain\myUserName

मुझे जो मिल रहा है वह \ _ एक एस्केप कैरेक्टर होने के बारे में एक वाक्यविन्यास त्रुटि है। अगर मैं \\ में डाल देता हूं तो snytax त्रुटि हो गई है, लेकिन आउटपुट myDomain \\ myUTERname है

मैं एक प्रक्षेपित स्ट्रिंग में बच गए पात्रों को कैसे शामिल कर सकता हूं?


धन्यवाद। लेकिन तब मैं स्ट्रिंग प्रक्षेप का उपयोग नहीं कर सकता? मैं सब कुछ नहीं बचना चाहता। मैं सिर्फ एक प्रक्षेप स्ट्रिंग के अंदर एक बैकस्लैश का उपयोग करना चाहता हूं।
मैट

नहीं, तुम नहीं कर सकते। उसका जवाब गलत है।
ग्रीनहॉर्न

3
मेरे लिए एक बग की तरह लगता है;) \\ काम करना चाहिए
मैट

मुझे $ {डोमेन} \\ {userName} के लिए सही आउटपुट मिलता है .. क्या यह एक वेब अनुप्रयोग है?
ग्रीनहॉर्न

2
नन का जवाब पूरी तरह से काम करने लगता है। $@"{domain}\{userName}"। मुझे लगता है कि आपको इसे आज़माना चाहिए, और इसे स्वीकार करना चाहिए। मेरे पास ठीक यही समस्या थी, इसके लिए डोमेन और उपयोगकर्ता नाम भी है, और उनकी विधि ठीक काम करती है।
प्रोफक डे

जवाबों:


104

बैकस्लैश के साथ भागने ( \) एक घुंघराले ब्रेस को छोड़कर सभी पात्रों के लिए काम करता है।

यदि आप एक घुंघराले ब्रेस ( {या }) से बचने की कोशिश कर रहे हैं , तो आपको https://msdn.microsoft.com/en-us/library/dn961160.aspx का उपयोग {{या }}प्रति करना होगा ।

... डबल घुंघराले ब्रेसिज़ की सभी घटनाएं ("{{" और "}}") एक घुंघराले ब्रेस में बदल जाती हैं।


यह स्वयं बैकस्लैश के लिए काम नहीं करता है, जैसा कि ओपी स्पष्ट रूप से बताता है।
प्रोफक

79

आप $ @ दोनों का उपयोग करके ऐसा कर सकते हैं। आदेश महत्वपूर्ण है।

var combo = $@"{domain}\{userName}";

4
सबसे अच्छा और सरल जवाब। यह न समझें कि लोग अधिक जटिल उत्तर क्यों चुनते हैं। शब्दशः प्रक्षेपित स्ट्रिंग के लिए MSDN लिंक docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758

2
"सी # 8.0 के साथ शुरू, आप किसी भी क्रम में $ और @ टोकन का उपयोग कर सकते हैं" (उपरोक्त टिप्पणी में एलेक्स के लिंक से)।
केसी प्लमर

8

एडुआर्डो सही है। आप दोगुने होकर घुंघराले ब्रेसिज़ से बच जाते हैं। इसलिए, यदि आप {mydomain} डोमेन चर को आउटपुट करना चाहते हैं, तो आपको यह करना होगा:

$"{{{domain}}}";

इसके अलावा, यह मानते हुए कि वर्तमान तिथि 1 सितंबर 2016 है, यह कर:

$"The date is {DateTime.Now}";

आपके स्थानीयकरण के आधार पर "दिनांक 2016/09/01 3:04:48 PM" जैसा कुछ आउटपुट होगा। आप दिनांक को प्रारूपित करके भी कर सकते हैं:

$"The date is {DateTime.Now : MMMM dd, yyyy}";

जो "1 सितंबर 2016 की तारीख है" आउटपुट होगा। इंटरपोल किए गए तार बहुत अधिक पठनीय हैं। अच्छा जवाब एडुआर्डो।


1
ओपी घुंघराले ब्रेसिज़ से बचने की कोशिश नहीं कर रहा है। वे स्पष्ट रूप से कहते हैं कि वे स्वयं एक बैकस्लैश से बचने की कोशिश कर रहे हैं, और सामान्य `\\` एक प्रक्षेपित स्ट्रिंग में काम नहीं करता है।
प्रोफक

3
मुझे परवाह नहीं है कि ओपी पूछ रहा था कि मैं घुंघराले ब्रेसिज़ से बचना चाहता था और पहली Google प्रविष्टि यह थी। इसलिए ओपी शीर्षक Google को गुमराह करता है और इसलिए यह एक मान्य उत्तर है और उत्थान के योग्य है।
एंड्रयूबेनजीन

4
$"{domain}\\{user}"

ठीक काम करता है - भागने वाला हमेशा की तरह काम करता है (भागने के अलावा {)। कम से कम .NET 4.6 और VS 14.0.22823 D14REL पर।

यदि यह किसी कारण से काम नहीं करता है (हो सकता है कि आप संकलक के पुराने संस्करण का उपयोग कर रहे हों?), तो आप अधिक स्पष्ट होने का भी प्रयास कर सकते हैं:

$"{domain}{@"\"}{user}"

यही मैंने भी सोचा था। दिलचस्प है, मेरी सतह पर प्रो 3, कोड सामान्य \\ या स्पष्ट @ "\" के साथ ठीक काम करता है, हालांकि मेरे काम की मशीन पर ऐसा नहीं होता है। इसलिए मुझे लगता है कि आपने इंस्टॉल किए गए संस्करण के संबंध में सिर पर कील ठोक दी होगी। मेरी कार्य मशीन कह रही है कि कोई भी अपडेट उपलब्ध नहीं है, दुर्भाग्य से। तो, मेरा आपसे सवाल यह है कि मैं अपनी मशीन पर .net 4.6 का सटीक संस्करण / निर्माण कैसे निर्धारित करूं? इस संबंध में चीजें थोड़ी बदल गई हैं, ऐसा प्रतीत होता है कि एक बिल्ड / संस्करण संख्या पर बहुत अधिक मार्गदर्शन नहीं पा रहा है।
मैट

जो मैं बता सकता हूं कि मैं दोनों मशीनों पर .net और बनाम 2015 आरसी का एक ही संस्करण चला रहा हूं। एकमात्र अंतर जो मैं सोच सकता हूं, वह यह है कि मशीन जो उम्मीद के मुताबिक काम कर रही है (SP3) 10. 10. नवीनतम इंसाइडर पूर्वावलोकन चला रही है। मेरा मानना ​​है कि .net फ्रेमवर्क इसी के साथ आता है, इसलिए हो सकता है कि मेरा कोई नया संस्करण हो। मैं अभी नहीं जानता कि कैसे विशेष रूप से जांच करने के लिए।
मैट

अद्यतन देखें: cr.dll के लिए संपत्ति विवरण में c: \ windows \ microsoft.net \ Framework64 \ v4.0.30319 फ़ोल्डर मैं एक अंतर देख सकता हूं। मेरी सतह पर संस्करण 4.6.79.0 है और मेरी कार्य मशीन पर संस्करण 4.6.57.0 है। तो मेरा सवाल अब यह है कि मैं 4.6.57.0 से 4.6.79.0 तक कैसे अपग्रेड करूं? (यह कठिन क्यों है?)
मैट

@ मैट मुझे नहीं लगता कि यह है - मेरे पास 4.6.57.0 भी है और यह ठीक काम करता है। क्या यह संभव है कि आपके पास कुछ विजुअल स्टूडियो एक्सटेंशन स्थापित हों जो चीजों को गड़बड़ कर दें?
लुआँ

यदि आप किसी भी अपडेट को नहीं देखने के बावजूद व्यवहार में अंतर देखते हैं, तो संभवतः नवीनतम C # सुविधाओं का उपयोग करने वाली परियोजनाओं में NuGet पैकेज "Microsoft.Net.Compilers" के उपयोग पर विचार करें। यह व्यवहार में मनाया मतभेदों को हल कर सकता है। यह हमारी परियोजनाओं में किया था।
मैनफ्रेड

3

हाय, पीछे वाले स्लैश में भागने के नियम रूले स्लैप में डुप्लिकेट है:

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\\{userName}";

कंसोल आउटपुट

लेकिन अगर आप वर्बटिम स्ट्रिंग के रूप में प्रक्षेपित स्ट्रिंग का उपयोग करते हैं तो आपको बैक स्लैश से बचने की आवश्यकता नहीं है:

var domain = "mydomain";
var userName = "myUserName";
var combo = $@"{domain}\{userName}";

और आपको वही मिलता है:

कंसोल आउटपुट

प्रक्षेप स्ट्रिंग के बारे में एक ट्यूटोरियल के लिए: देखें वीडियो प्रक्षेपित स्ट्रिंग


0

अगर मैं गलत नहीं समझा। समाधान वास्तविक सरल है

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{{{domain}}}\\{{{userName}}}";
Console.WriteLine(combo);

मैं वहां उपलब्ध कराए गए अच्छे संदर्भों के बारे में बर्डमॉन्गमैन जवाब साझा करता हूं। आशा है कि यह आपके लिए उपयोगी है। मेरे 5 सेंट


1
आपने गलत समझा। ओपी घुंघराले ब्रेसिज़ से बचने की कोशिश नहीं कर रहा है। वे स्पष्ट रूप से कहते हैं कि वे खुद एक बैकस्लैश से बचने की कोशिश कर रहे हैं, और सामान्य `\\` एक प्रक्षेपित स्ट्रिंग में काम नहीं करता है
ProfK

-1

आप इसका उपयोग कर सकते हैं -

'First, declare the curley braces as chars
        Dim LeftBrace As Char = "{"
        Dim RightBrace As Char = "}"

        'Then in your string, use like this-
        Dim myStr As String = $"This is a {LeftBrace}String{RightBrace}"

        'Now, the output will be
        ' This is a {string}code here

यह कोई C # नहीं है? (लेकिन VB.NET?)
जूलियन

खैर, यह वही भावना है जब एक vb .net प्रोग्रामर को अपने प्रश्न के लिए एसी # उत्तर मिलता है।
विनोद केसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.