2010-09-04 17 views
5

मुझे <string,string> के संग्रह को एक ही स्ट्रिंग में कनवर्ट करने की आवश्यकता है जिसमें संग्रह में सभी मान शामिल हैं जैसे KeyValueKeyValue ... लेकिन मैं इसे प्रभावी ढंग से कैसे कर सकता हूं?संग्रह को स्ट्रिंग में बदलने के लिए सबसे अच्छा तरीका

मैं इसे इस समय इस तरह से किया है:

parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value))); 

लेकिन यकीन नहीं यह यह करने के लिए सबसे अच्छा तरीका है, एक स्ट्रिंग बिल्डर बेहतर होगा? मुझे लगता है कि संग्रह में अधिकतम 10 जोड़े होंगे।

+1

आपका तरीका बहुत अच्छा और कॉम्पैक्ट दिखता है। – tidwall

उत्तर

4

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

इस तरह

:

var sb = new Text.StringBuilder; 
foreach (var item in requestParameters) 
{ 
    sb.AppendFormat("{0}{1}", item.Key, item.Value); 
} 
var parameters = sb.ToString(); 
+1

लेकिन यह सिर्फ 'string.Join' आंतरिक रूप से करता है जो डुप्लिकेट कर रहा है (ओपी .NET 4.0 पर प्रतीत होता है, इसलिए उसे ओवरलोड पर पहुंच प्राप्त हुई है जो 'IEnumerable ' स्वीकार करता है)। –

0

स्ट्रिंग बिल्डर ठीक होगा। प्रत्येक स्ट्रिंग को स्ट्रिंग बिल्डर में जोड़ने के लिए संलग्न करें का उपयोग करें।

असल में एकमात्र कारण क्यों है कि कॉन्सट, प्रतिस्थापित, जुड़ें, स्ट्रिंग + स्ट्रिंग इत्यादि को सबसे अच्छा नहीं माना जाता है क्योंकि वे सभी मौजूदा स्ट्रिंग को नष्ट कर देते हैं & एक नया बनाते हैं।

तो जब आप 10-12 समय तक स्ट्रिंग जोड़ रहे हैं तो इसका वास्तव में मतलब है कि आप & को कई बार एक स्ट्रिंग को फिर से नष्ट कर देंगे।

5

string.Join वास्तव में सबसे अच्छा विकल्प है क्योंकि यह केवल string[] या object[] मानकों स्वीकार किए जाते हैं, की आवश्यकता होती है कि किसी भी select शैली प्रश्नों पूरी तरह से मूल्यांकन किया है और एक सरणी में पहले रखा जाना करने की जरूरत नहीं करने के लिए इस्तेमाल ।

.NET 4.0 यह an overload that accepts IEnumerable<string> साथ लाया - है जो आप उपयोग कर रहे हैं - और यहां तक ​​कि an overload that accepts any IEnumerable<T>। ये निश्चित रूप से आपकी सर्वश्रेष्ठ शर्त हैं क्योंकि वे अब बीसीएल का हिस्सा हैं। ,

public static string Join(string separator, IEnumerable<string> values) 
{ 
    if (values == null) 
    { 
     throw new ArgumentNullException("values"); 
    } 
    if (separator == null) 
    { 
     separator = Empty; 
    } 
    using (IEnumerator<string> enumerator = values.GetEnumerator()) 
    { 
     if (!enumerator.MoveNext()) 
     { 
      return Empty; 
     } 
     StringBuilder builder = new StringBuilder(); 
     if (enumerator.Current != null) 
     { 
      builder.Append(enumerator.Current); 
     } 
     while (enumerator.MoveNext()) 
     { 
      builder.Append(separator); 
      if (enumerator.Current != null) 
      { 
       builder.Append(enumerator.Current); 
      } 
     } 
     return builder.ToString(); 
    } 
} 
दूसरे शब्दों में

तो, आप अगर आप एक StringBuilder उपयोग करने के लिए इस कोड को परिवर्तित करने के लिए किए गए:

संयोग से, खुला खुर Reflector में पहली अधिभार के लिए स्रोत कोड है कि what davisoa suggested को बहुत बारीकी से इस प्रकार से पता चलता एमएस सिर्फ आपके लिए लिखे गए एमएस को फिर से लिखना होगा।

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

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