2012-09-25 15 views
8

कभी-कभी मैं बीच में एक स्पेस के साथ दो तारों में शामिल होना चाहता हूं। लेकिन अगर दूसरी स्ट्रिंग शून्य है, तो मुझे स्पेस नहीं चाहिए।स्ट्रिंग में जोड़ें यदि स्ट्रिंग खाली नहीं है

पर विचार करें कोड निम्नलिखित:

void AssertFoo(bool cond, string message = null) { 
    ... 
    Assert.Fail("Something is foo.{0}", message != null ? " " + message : ""); 
    ... 
} 

वहाँ ऐसा करने के लिए एक और अधिक सुरुचिपूर्ण रास्ता नहीं है?

उत्तर

24

यहां एक विकल्प है जो मुझे पसंद है। यह बेहतर है कि आपके पास पहले से ही IEnumerable<string> आपके डेटा के साथ है, लेकिन यदि आप नहीं करते हैं तो यह काफी आसान है। यह स्पष्ट रूप से एन स्ट्रिंग्स में शामिल होने के लिए अच्छी तरह से स्केल करता है, केवल 1 या दो नहीं।

string[] myStrings = new string[]{"Hello", "World", null}; 
string result = string.Join(" ", myStrings.Where(str => !string.IsNullOrEmpty(str))); 

यहां एक और विकल्प है। यह इस एक मामले के लिए एक सा कम है, लेकिन यह, भद्दा कठिन पढ़ने के लिए, और के रूप में विस्तृत नहीं है, तो मैं शायद यह व्यक्तिगत रूप से बचने होगा:

//note space added before {0} 
Assert.Fail("Something is foo. {0}", message ?? "\b"); 

इस मामले हम प्रारूप स्ट्रिंग ही जगह जोड़ में, लेकिन अगर message शून्य है तो हम उस स्थान को हटाने के लिए बैकस्पेस वर्ण का उपयोग करते हैं जिसे हम जानते हैं कि संदेश में इससे पहले है।

+0

मुझे लगता है कि माना जाता है। अगर मुझे आवश्यकता हो तो मैं {0}, {1}, {2} का उपयोग करने का विकल्प चाहूंगा। यह मेरे पास पहले से कहीं ज्यादा पठनीय नहीं है। –

0

इस प्रयास करें:

string joinedString = string.IsNullOrEmpty(message2) ? message1 : message1 + " " + message2; 
-5

सबसे खूबसूरत तरीका स्ट्रिंग वर्ग की इनबिल्ट कीवर्ड का प्रयोग है।

String.IsNullOrEmpty 

इस तरह आपको कोई समस्या नहीं है।

+2

यह सवाल का जवाब नहीं देता है। – stephen

1
Assert.Fail("Something is foo.{0}", (" " + message).TrimEnd()); 

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

0

सी # आप निम्नलिखित विस्तार विधि का उपयोग कर सकते हैं के नए संस्करणों के लिए:

public static string Prepend(this string value, string prepend) => prepend + value; 

यह इस तरह इस्तेमाल किया जा सकता:

Assert.Fail("Something is foo.{0}", message?.Prepend(" ")); 
संबंधित मुद्दे