शब्दकोश परिवर्तित करें <string, string> semicolon से अलग स्ट्रिंग में c #


135

दिन शुरू करने के लिए सरल, Dictionary<string, string>इस प्रकार दिया गया है:

var myDict = new Dictionary<string, string>();
myDict["A"] = "1";
myDict["B"] = "2";
myDict["C"] = "3";
myDict["D"] = "4";

मैं एक स्ट्रिंग बनाना चाहता हूं: "A=1;B=2;C=3;D=4"

एक उदाहरण कार्यान्वयन:

var myStringBuilder = new StringBuilder();
bool first = true;
foreach (KeyValuePair<string, string> pair in myDict)
{
    if (first)
    {
        first = false;
    }
    else
    {
        myStringBuilder.Append(";");
    }

    myStringBuilder.AppendFormat("{0}={1}", pair.Key, pair.Value);
}

var myDesiredOutput = myStringBuilder.ToString();

नोट शब्दकोश में 10 से कम आइटम होने की संभावना है, जो बताता है कि एक स्ट्रिंगबुलस्टल ओवरकिल है।

क्या वैकल्पिक कार्यान्वयन अधिक सफल / कुशल हैं? क्या रूपरेखा में कोई विशेषता है जो मदद करेगी?

जवाबों:


290
using System.Linq;

string s = string.Join(";", myDict.Select(x => x.Key + "=" + x.Value).ToArray());

(और यदि आप .NET 4 या नए का उपयोग कर रहे हैं, तो आप अंतिम ToArrayकॉल को छोड़ सकते हैं ।)


अच्छा :-) हालांकि, मैं String.Format का उपयोग करेंगे ( "{0} = {1}", x.Key, x.Value) के बजाय + ऑपरेटर
अमित्ताई शापिरा

7
@Amittai, @the_drow: आप पसंद कर सकते हैं string.Format; मैं k+"="+vइस तरह के सरल सम्मेलनों के लिए पसंद करता हूं । प्रत्येक का अपना अनुमान है ...
ल्यूक

2
ध्यान दें कि कॉल की ToArray()आवश्यकता नहीं है। इसे हटाने के String.Join<String>(String, IEnumerable<String>)बजाय कॉल में परिणाम होता है String.Join(String, String[])
डैन स्टीवंस

8
यदि आप सटीक आउटपुट प्रारूप की परवाह नहीं करते हैं, तो आप कर सकते हैं string.Join(", ", myDict)। यह फॉर्म में आउटपुट होगा[A, 1], [B, 2], [C, 3], [D, 4]
altumano

2
@SRJ रिक्त नल से बहुत अलग है .... खाली "", या व्हाट्सएप " ", एक शब्दकोश में मान्य कुंजी हैं। हालांकि या तो उपयोग करने की सलाह नहीं दी गई है, वे वैध मूल्य हैं। ContainsKeyयदि आपको foreachमानों को पकड़ने के लिए विशिष्ट कुंजी नाम या भाषा के निर्माण की आवश्यकता है, तो आपको एक जांच करने की आवश्यकता है ।
गोल्डबिशप

39

एक अन्य विकल्प यह है कि जुड़ें के बजाय एग्रीगेट एक्सटेंशन का उपयोग करें:

String s = myDict.Select(x => x.Key + "=" + x.Value).Aggregate((s1, s2) => s1 + ";" + s2);

बिल्कुल सही शैली!
menkow

1

Linq के लिए Dictionaryआप पर काम करने के लिए कम से कम .net v3.5 और using System.Linq;

कुछ विकल्प:

string myDesiredOutput = string.Join(";", myDict.Select(x => string.Join("=", x.Key, x.Value)));

या

string myDesiredOutput = string.Join(";", myDict.Select(x => $"{x.Key}={x.Value}"));

यदि आप किसी कारण से Linq का उपयोग नहीं कर सकते हैं, तो उपयोग करें Stringbuilder:

StringBuilder sb = new StringBuilder();
var isFirst = true;
foreach(var x in myDict) 
{
  if (isFirst) 
  {
    sb.Append($"{x.Key}={x.Value}");
    isFirst = false;
  }
  else
    sb.Append($";{x.Key}={x.Value}"); 
}

string myDesiredOutput = sb.ToString(); 

myDesiredOutput:

A=1;B=2;C=3;D=4

-3

यह वही उत्तर है जो @LukeH के पास है।
रिक ग्लोस

यार यह वही नहीं है, ToArray () का उपयोग करने की कोई आवश्यकता नहीं है। कृपया मेरा उत्तर न दें।
जयदीप शील

2
यह वही है - वह ToArray()रूपरेखा के उच्च संस्करणों का उपयोग करते समय हटाने का उल्लेख करता है ।
रिक ग्लोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.