2013-01-02 21 views
14

के स्थान पर "और" के साथ अल्पविराम से अलग सूची मैं सी # में एक अल्पविराम से अलग सूची बनाना चाहता हूं, शब्द "और" अंतिम डेलीमीटर के साथ।अंतिम अल्पविराम

string.Join(", ", someStringArray) 

इस

Apple, Banana, Pear 

इस तरह की स्ट्रिंग में परिणाम होगा, लेकिन इसके बजाय मैं इसे इस तरह दिखना चाहते हैं:

Apple, Banana and Pear 

वहाँ Linq और साथ इसे प्राप्त करने के लिए एक सरल तरीका है loops का उपयोग कर के बिना?

+0

क्या आइटम वर्तमान में उसी क्रम में दिखने के लिए हैं, या क्या हम उन्हें फिर से व्यवस्थित कर सकते हैं? –

+0

वे एक ही क्रम में होना चाहिए। – bytecode77

+4

'और लूप का उपयोग किए बिना - जैसा कि उत्तर साबित होते हैं, आपको इसके लिए स्पष्ट लूप की आवश्यकता नहीं है। हालांकि, लूप शायद ही कभी बुरा हैं, और LINQ वास्तव में सिर्फ आपके लिए लूप उत्पन्न कर रहा है। –

उत्तर

22

आप पिछले एक को छोड़कर सभी वस्तुओं पर एक साथ जुड़ें और फिर मैन्युअल रूप से पिछले आइटम जोड़ने कर सकते हैं:

using System; 
using System.Linq; 

namespace Stackoverflow 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DumpResult(new string[] { }); 
      DumpResult(new string[] { "Apple" }); 
      DumpResult(new string[] { "Apple", "Banana" }); 
      DumpResult(new string[] { "Apple", "Banana", "Pear" }); 
     } 

     private static void DumpResult(string[] someStringArray) 
     { 
      string result = string.Join(", ", someStringArray.Take(someStringArray.Length - 1)) + (someStringArray.Length <= 1 ? "" : " and ") + someStringArray.LastOrDefault(); 
      Console.WriteLine(result); 
     } 
    } 
} 

जैसा कि आप देख सकते हैं, वहाँ मदों की राशि पर एक जाँच है और अगर यह आवश्यक है फैसला करता है 'और' भाग जोड़ने के लिए।

+1

अच्छा है, लेकिन क्या होगा यदि सूची में दो से कम आइटम हैं? –

+1

फिर, हमें इसका उपयोग करने की आवश्यकता होगी: स्ट्रिंग दिन = string.Join (",", notSentDays.Take (notSentDays.Count - 1)) + (notSentDays.Count == 1? "": "और") + notSentDays .Last(); – bytecode77

+0

मैं 'IENumerable ' अधिभार की तुलना में 'स्ट्रिंग, स्ट्रिंग [], int, int' अधिभार का उपयोग करना चाहता हूं। – Rawling

11

एक संभव समाधान:

var items = someStringArray; // someStringArray.ToList() if not a ICollection<> 
var s = string.Join(", ", items.Take(items.Count() - 1)) + 
     (items.Count() > 1 ? " and " : "") + items.LastOrDefault(); 

ध्यान दें कि यह बयान someStringArray कई बार पुनरावृति अगर यह ICollection<string> (सूचियों और सरणियों इसे लागू) को लागू नहीं करता है सकते हैं। यदि ऐसा है, तो अपने संग्रह के साथ एक सूची बनाएं और उस पर क्वेरी करें।

+0

0, 1 और 2+ प्रविष्टियों के साथ पूरी तरह से काम करता है। अच्छा! –

+1

@ जोनबी: आपका मतलब है "0 प्रविष्टियों के साथ पूरी तरह से काम करना"। क्या होना चाहिए –

+0

@ मार्कबियर - यह अपवाद पैदा करने या "," या "और" जैसे कुछ लौटने के बजाय "" देता है। –

2

क्या यह लिंक के साथ और लूप का उपयोग किए बिना हासिल करने का एक आसान तरीका है?

लूप के बिना संभव नहीं है। लूप के लिए सबसे अच्छा काम करेगा। LINQ प्रश्न एकाधिक लूप का उपयोग करेंगे।

string Combine (IEnumerable<string> list) 
    { 
     bool start = true; 
     var last = string.Empty; 
     String str = string.Empty; 

     foreach(var item in list) 
     { 
      if (!start) 
      { 
       str = str + " , " + item; 
       last = item; 

      } 
      else 
      { 
       str = item; 
       start = false; 
      } 

     } 

     if (!string.IsNullOrWhiteSpace(last)) 
     { 
      str = str.Replace(" , " + last, " and " + last); 
     } 

     return str; 
    } 
+0

पढ़ने और समझने के लिए बहुत आसान है। – SoftwareCarpenter

+0

ठीक है, यदि सूची काफी लंबी थी तो एकाधिक लूप प्रदर्शन समस्या प्राप्त कर सकते थे। चूंकि लगभग 5 प्रविष्टियां हैं, प्रदर्शन कोई फर्क नहीं पड़ता। लिंक का उपयोग करने का कारण स्पेगेटी कोड से बचने के लिए है। इस परियोजना पर लगभग 10 लोग काम कर रहे हैं, इसलिए हम इस तरह की पठनीयता के लिए प्रदर्शन का आदान-प्रदान नहीं कर सकते हैं। लेकिन आपके उत्तर के लिए धन्यवाद। – bytecode77

+2

@ डेविल, यदि कई प्रविष्टियां हैं तो 'स्ट्रिंग' के बजाय' स्ट्रिंगबिल्डर 'का उपयोग करें। अन्यथा यह किसी अन्य 'LINQ' क्वेरी की तुलना में सबसे कुशल समाधान है। मैं हमेशा LINQ में सब कुछ करने की कोशिश करता हूं (जैसा कि यह पठनीय है), लेकिन जब प्रदर्शन के मुद्दे आते हैं, तो LINQ का उपयोग करके सबसे खराब कोड लिखना आसान है> – Tilak