2009-11-10 10 views
7

मुझे एक स्ट्रिंग सरणी मिली है जिसे मैं LINQ के माध्यम से एक स्ट्रिंग बिल्डर में जोड़ना चाहता हूं।LINQ एक स्ट्रिंग से स्ट्रिंगबिल्डर को जोड़ने के लिए []

मैं मूल रूप से कहने की कोशिश कर रहा हूं कि "इस सरणी में प्रत्येक आइटम के लिए, इस स्ट्रिंगबिल्डर को एक लाइन संलग्न करें"।

मैं इसे फ़ोरैच लूप का उपयोग करके आसानी से कर सकता हूं हालांकि निम्न कोड कुछ भी नहीं प्रतीत होता है। मैं क्या खो रहा हूँ?

stringArray.Select(x => stringBuilder.AppendLine(x)); 

के रूप में जहां इस काम करता है:

foreach(String item in stringArray) 
{ 
    stringBuilder.AppendLine(item); 
} 
+0

मैं इसका उपयोग नहीं करता। चयन आदेश ... ForEach कमांड उपलब्ध नहीं है? – sebagomez

+0

मैंने निम्न केस पहले चार का उपयोग करने के लिए स्ट्रिंगबिल्डर और स्ट्रिंगअरे का नाम बदल दिया है। बस यह स्पष्ट करने के लिए कि मैं उदाहरण चर के लिए refering कर रहा हूँ और प्रकार नहीं। –

+0

हाँ यह है ... http://msdn.microsoft.com/en-us/library/zecdkyw2.aspx :) – sebagomez

उत्तर

18

आप एक LINQy तरीके से कर रही पर जोर देते हैं:

StringBuilder builder = StringArray.Aggregate(
          new StringBuilder(), 
          (sb, s) => sb.AppendLine(s) 
         ); 

वैकल्पिक रूप से, के रूप में Luke एक और पोस्ट पर एक टिप्पणी में बताया, आप कह सकते

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s)); 

कारण यह है कि Select करता है काम नहीं है क्योंकि Select प्रक्षेपण के IEnumerable प्रक्षेपण और निर्माण के लिए है। तो कोड

StringArray.Select(s => stringBuilder.AppendLine(s)) 

की लाइन StringArray प्रत्येक यात्रा पर stringBuilder.AppendLine(s) बुला से अधिक पुनरावृति नहीं है। इसके बजाय, यह IEnumerable<StringBuilder> बनाता है जिसे समझा जा सकता है।

मुझे लगता है कि आप

var e = stringArray.Select(x => stringBuilder.AppendLine(x)); 
StringBuilder sb = e.Last(); 
Console.WriteLine(sb.ToString()); 

कह सकते हैं लेकिन वह वास्तव में घृणित है लगता है।

+0

धन्यवाद जेसन। आपका उत्तर बताता है कि चयन विधि ने मुझे जो नतीजा नहीं मिला और क्यों foreach काम कर रहा था। मैं foreach के साथ रहना होगा। मैं वास्तव में सिर्फ इतना उत्सुक था कि मैं क्या खो रहा था। अब मुझे पता है। –

+0

अंतिम() फिर से शुरू करने की गारंटी है? केवल स्ट्रिंगअरे [stringArray.count-1] लाने के बजाय? मुझे लगता है कि मैंने ToList() को प्राथमिकता दी होगी; – Taemyr

0

StringArray.DoForAll (x => StringBuilder.AppendLine (x));

+0

'DoForAll' क्या है? – jason

+0

क्षमा करें, मेरे पास इतनी देर तक यह विस्तार विधि है, मैं भूल गया कि ढांचे का हिस्सा नहीं है। \t सार्वजनिक स्थैतिक कक्षा CommonExtensions \t { \t \t public static void DoForAll (इस IEnumerable आइटम, कार्रवाई कार्रवाई) \t \t \t जहां टी: वर्ग \t \t { \t \t \t अगर (कार्रवाई == बातिल) \t \t \t \t नया ArgumentNullException ("कार्रवाई") फेंक दें; \t \t \t foreach (मदों में वर आइटम) \t \t \t \t कार्रवाई (आइटम); \t \t \t \t} } – vladhorby

+0

@vladhorby: क्यों 'DoForAll' और अन्य समकक्ष एक्सटेंशन लागू नहीं किया जाता है पर एक राय यह है: http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs -foreach.aspx – jason

6

"चयन" के बजाय "FOREach" एक्सटेंशन विधि का उपयोग करें।

stringArray.ForEach(x => stringBuilder.AppendLine(x)); 

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

  • कोई संबंधित समस्या नहीं^_^