2011-05-05 18 views
49

मुझे लगता है कि शब्दकोश में ToString का डिफ़ॉल्ट अपूर्णता मैं नहीं चाहता हूं। मुझे {key=value, ***} होना चाहिए।क्या एक शब्दकोश को स्ट्रिंग में कनवर्ट करने के लिए वैसे भी है?

इसे पाने का कोई आसान तरीका?

+3

केवल डीबगर में दृश्य के लिए यह है? या यह स्ट्रिंग उपयोगकर्ता का सामना करने का इरादा है? – TreDubZedd

+1

मुझे लगता है कि यह JSON serializer –

+0

द्वारा बहुत अच्छा किया गया है http://stackoverflow.com/questions/3639094/most-efficient-dictionaryk-v-tostring-with-formatting –

उत्तर

74

इस विस्तार विधि का प्रयास करें:

public static string ToDebugString<TKey, TValue> (this IDictionary<TKey, TValue> dictionary) 
{ 
    return "{" + string.Join(",", dictionary.Select(kv => kv.Key + "=" + kv.Value).ToArray()) + "}"; 
} 
+1

I 'ToArray() 'की आवश्यकता नहीं है, न तो' ToString() 's के लिए। –

+1

@StevenJeuris: 'ToArray()' वास्तव में आवश्यक है, यदि आप .NET 4.0 – Jack

+1

से जावा संस्करण में बिल्कुल map.toString() की तरह संस्करण का उपयोग कर रहे हैं;) – Choletski

3

शायद:

string.Join 
(
    ",", 
    someDictionary.Select(pair => string.Format("{0}={1}", pair.Key.ToString(), pair.Value.ToString())).ToArray() 
); 

सबसे पहले आप प्रत्येक कुंजी-मान पेयर पुनरावृति और यह प्रारूप के रूप में आप स्ट्रिंग के रूप में देखने के लिए, और बाद में सरणी में बदलने का और एक एकल स्ट्रिंग में शामिल होने के लिए करना चाहते हैं।

10

कैसे एक विस्तार-विधि जैसे के बारे में:

public static string MyToString<TKey,TValue> 
     (this IDictionary<TKey,TValue> dictionary) 
{ 
    if (dictionary == null) 
     throw new ArgumentNullException("dictionary"); 

    var items = from kvp in dictionary 
       select kvp.Key + "=" + kvp.Value; 

    return "{" + string.Join(",", items) + "}"; 
} 

उदाहरण:

var dict = new Dictionary<int, string> 
{ 
    {4, "a"}, 
    {5, "b"} 
}; 

Console.WriteLine(dict.MyToString()); 

आउटपुट:

{4=a,5=b} 
+0

सांस लें और निर्दिष्ट करें कि यह एक विस्तार विधि है: D –

0

आप कर सकते हैं शब्दकोश की कुंजी और उन्हें प्रिंट के माध्यम से लूप मूल्य के साथ ...

public string DictToString(Dictionary<string, string> dict) 
{ 
    string toString = ""; 
    foreach (string key in dict.Keys) 
    { 
      toString += key + "=" + dict[key]; 
    } 
    return toString; 
} 
-5

आप क्या करना है, एक वर्ग Dictionary का विस्तार बना सकते हैं और ToString() विधि अधिलेखित करने के लिए है।

आपको

+0

क्या मुझे पता है कि किसी ने इस पर इशारा क्यों किया? :) धन्यवाद, अगर मैं गलत हूं तो मैं चाहूंगा कि मैं कहां गलत हूं। धन्यवाद। – Amedio

+1

मैंने इस उत्तर को कम नहीं किया है, लेकिन यह नमूना कोड प्रदान नहीं करता है। साथ ही, सबक्लासिंग एक अनावश्यक हथौड़ा की तरह प्रतीत होता है जब आप कुछ अन्य उत्तरों में दिखाए गए विस्तार विधि को लिख सकते हैं; यह आपको अपने नियंत्रण के बाहर कोड से प्राप्त होने वाले शब्दकोशों पर सीधे विस्तार विधि को कॉल करने की अनुमति देता है जहां आप अपने उप-वर्ग का उपयोग करने में सक्षम नहीं होंगे। – Eliot

6

कोई आसान तरीका नहीं है। आपको अपना खुद का रोल करना होगा।

public static string ToPrettyString<TKey, TValue>(this IDictionary<TKey, TValue> dict) 
{ 
    var str = new StringBuilder(); 
    str.Append("{"); 
    foreach (var pair in dict) 
    { 
     str.Append(String.Format(" {0}={1} ", pair.Key, pair.Value)); 
    } 
    str.Append("}"); 
    return str.ToString(); 
} 
+1

यह सहायक है क्योंकि यह प्री-.NET3.5 कोड (बिना linq समर्थन के) पर काम करता है –

2

मुझे यह आसान जवाब मिला .. JavaScriptSerializer इस के लिए कक्षा का उपयोग करें।

और आप आसानी से शब्द वस्तु के साथ Serialize विधि को तर्क के रूप में कॉल कर सकते हैं।

उदाहरण:

var dct = new Dictionary<string,string>(); 
var js = new JavaScriptSerializer(); 
dct.Add("sam","shekhar"); 
dct.Add("sam1","shekhar"); 
dct.Add("sam3","shekhar"); 
dct.Add("sam4","shekhar"); 
Console.WriteLine(js.Serialize(dct)); 

आउटपुट:

String.Format("{{{0}}}", String.Join(",", test.OrderBy(_kv => _kv.Key).Zip(test, (kv, sec) => String.Join("=", kv.Key, kv.Value)))); 

जहां "परीक्षण" अपने शब्दकोश है:

{"sam":"shekhar","sam1":"shekhar","sam3":"shekhar","sam4":"shekhar"} 
3

आप Linq का उपयोग करना चाहते हैं, तो आप कुछ इस तरह की कोशिश कर सकते । ध्यान दें कि ज़िप() के लिए पहला पैरामीटर केवल प्लेसहोल्डर है क्योंकि शून्य को पारित नहीं किया जा सकता है)।

प्रारूप महत्वपूर्ण नहीं है, तो

String.Join(",", test.OrderBy(kv => kv.Key)); 

आप बस डिबगिंग उद्देश्यों के लिए क्रमानुसार करने चाहते हैं जो तुम जैसे

[key,value], [key,value],... 
+0

मुझे लिंक अभिव्यक्ति @Tim और अधिक प्रदान किया जाता है। – seairth

52

कुछ दे देंगे कोशिश, छोटे तरीका है:

var asString = string.Join(";", dictionary); 

यह काम करता है क्योंकि IDictionary<TKey, TValue> एक ICollection<KeyValuePair<TKey, TValue>> है।

+3

+1 असली सुंदर नहीं है, लेकिन यह काम करता है और सरल है। –

+0

महान काम करता है। आपका बहुत बहुत धन्यवाद। –

+3

शानदार! यह मेरा पूरा जीवन कहां रहा है? – Tony

0

मुझे शेरहायर_Pro के serializer का उपयोग करने के दृष्टिकोण पसंद है। केवल धीमे होने के बाद से अंतर्निहित जावास्क्रिप्टसेरियलाइज़र की बजाय serialize करने के लिए json.net का उपयोग करना है।

+1

यह एक टिप्पणी होनी चाहिए, उत्तर नहीं। उत्तर अनुभाग को स्पैम करने के बजाए टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा होने तक कृपया प्रतीक्षा करें। – Chris

1

एक अन्य समाधान:

var dic = new Dictionary<string, double>() 
{ 
    {"A", 100.0 }, 
    {"B", 200.0 }, 
    {"C", 50.0 } 
}; 

string text = dic.Select(kvp => kvp.ToString()).Aggregate((a, b) => a + ", " + b); 

पाठ का मूल्य: [A, 100], [B, 200], [C, 50]

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