2009-07-14 7 views
9

मेरे पास कुछ LINQ कोड है जो स्ट्रिंग्स की एक सूची उत्पन्न करता है, जैसे:स्ट्रिंग्स की एक सूची को एक समेकित स्ट्रिंग में परिवर्तित करने का सबसे तेज़ तरीका?

var data = from a in someOtherList 
      orderby a 
      select FunctionThatReturnsString(a); 

मैं स्ट्रिंग्स की उस सूची को एक बड़ी कॉन्सटेनेटेड स्ट्रिंग में कैसे परिवर्तित करूं? आइए मान लें कि डेटा में इन प्रविष्टियां हैं:

"Some " 
"resulting " 
"data here." 

मुझे इस तरह दिखने वाली एक स्ट्रिंग के साथ समाप्त होना चाहिए:

"Some resulting data here." 

मैं इसे जल्दी से कैसे कर सकता हूं? मैंने इसके बारे में सोचा:

StringBuilder sb = new StringBuilder(); 
data.ToList().ForEach(s => sb.Append(s)); 
string result = sb.ToString(); 

लेकिन यह सही नहीं लगता है। यदि यह सही समाधान है, तो मैं इसे विस्तार विधि में बदलने के बारे में कैसे जाऊं?

उत्तर

22

कैसे के बारे में:

public static string Concat(this IEnumerable<string> source) { 
    StringBuilder sb = new StringBuilder(); 
    foreach(string s in source) { 
     sb.Append(s); 
    } 
    return sb.ToString(); 
} 

और:

string s = data.Concat(); 

यह तो अतिरिक्त ToList()/ToArray() कदम के लिए कोई जरूरत नहीं है।

+0

+1 यह सबसे छोटी विधि नहीं है, लेकिन ओपी स्पष्ट रूप से * सबसे तेज़ * के लिए पूछ रहा है, और यह वास्तव में 'string.Concat' /' string.Join' द्वारा 'ToArray()' का उपयोग करके धड़कता है। – Noldorin

+0

@ नोल्डोरिन: सबसे तेज़ अपरिभाषित है;) प्रोग्रामर या मशीन के लिए? –

+0

धन्यवाद! सबसे तेज़ से मेरा समय चलने का मतलब था। – jasonh

16

क्या आपने स्ट्रिंग की कोशिश की है। जॉइन? यदि आप पहले से ही ओवरहेड लेने के इच्छुक हैं। तोलिस्ट कॉल के बाद। टोएएरे() का उपयोग करें और इसे स्ट्रिंग में कॉल करें। जॉइन।

var joined = String.Concat(someQuery.ToArray()); 

नोट: मेरा समाधान संभवतः सबसे तेज़ नहीं है क्योंकि इसमें सरणी में थोड़ा अधिक ओवरहेड शामिल है। मेरा संदेह यह है कि यह मार्क के मार्ग पर जाने के लिए तेज़ होगा। लेकिन ज्यादातर मामलों में यदि आप कोड में ऐसा करने के लिए त्वरित और गंदे तरीके की तलाश में हैं, तो मेरा मार्ग काम करेगा।

+2

कोई विशेष कारण 'string.Concat' का उपयोग न करने का कोई कारण नहीं है? –

+0

@ मेहरदाद, नहीं, जॉइन पहले ही मेरे सिर में चले गए पहले व्यक्ति थे। – JaredPar

+0

मेरे परीक्षण प्रदर्शन में मार्क के समाधान (स्ट्रिंग और संग्रह की लंबाई की एक विस्तृत विविधता के लिए) के साथ गर्दन और गर्दन है, इसलिए आपको मेरा वोट मिलता है। – LukeH

3

उपयोग इस तरह "सकल":

List<string> strings = new List<string>() {"bob", "steve", "jane"}; 
    string result = strings.Aggregate((working, next) => working + next); 
    Console.WriteLine(result); 

नोट: सकल एक विस्तार पद्धति के रूप में System.Linq नाम स्थान में है।

+3

यह मध्यवर्ती तारों का *** बहुत *** हो सकता है ... –

0

जेआईटी इसे कैसे अनुकूलित करता है, इस पर निर्भर करता है कि स्ट्रिंगबिन्डर के साथ स्ट्रिंग। कॉनकैट() या मार्क की विधि तेज हो सकती है। आप Linq यहाँ का उपयोग कर रहे के बाद से, मैं मान लेंगे प्रदर्शन पूर्ण # 1 आवश्यकता, जिस स्थिति में मैं पढ़ने के लिए सबसे आसान के साथ जाना चाहते हैं नहीं है:

string.Concat(data.ToArray()); 

संपादित करें: यदि और डेटा केवल तभी एक मान प्रकार की IEnumerable, आप एक IEnumerable < वस्तु > करने के लिए इसे कास्ट करने के लिए की आवश्यकता होगी:

string.Concat(data.Cast<object>().ToArray()) 

संपादित करें 2: मैं वास्तव में मतलब यह नहीं है Linq धीमी है। मेरा मतलब केवल इतना है कि मेरे द्वारा वर्णित दो तरीकों के बीच गति अंतर बहुत ही कम होना चाहिए यदि मापने योग्य भी हो।

संपादित करें 3: जेआईटी स्ट्रिंग क्लास पर लगभग सभी परिचालनों को अनुकूलित करता है, इसलिए स्ट्रिंग के आंतरिक रनटाइम के लिए एकल कॉल। कॉनकैट वास्तव में स्ट्रिंगबिल्डर का उपयोग करने से तेज़ हो सकता है। मुझे यकीन नहीं है कि यह है, लेकिन आपको यह सुनिश्चित करने के लिए परीक्षण करना चाहिए।

+0

जब से लिंक धीमा होने के बराबर है? –

+0

मैंने स्पष्टीकरण के लिए संपादन # 2 जोड़ा, क्षमा करें। :) –

+0

आप 'data.Cast ()' डेटा की तरह कुछ करने के बजाय क्यों करेंगे। चयन करें (x => x.ToString()) '? – LukeH

1
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString(); 
0

वैकल्पिक:

>>> data = ['Some ', 'resulting ', 'data here.'] 
>>> s = ''.join(data) 
>>> s 
'Some resulting data here.' 
1

आप इस कथन का उपयोग कर सकते हैं। स्ट्रिंग। जॉइन ("", कुछ अन्य सूची);

+0

क्या आप थोड़ा और समझा सकते हैं? –

+0

शायद सबसे तेज़ नहीं, लेकिन सबसे सरल! – newman

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

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