Is there anyway to handy convert a dictionary to String?

C#DictionaryTostring

C# Problem Overview


I found the default implemtation of ToString in the dictionary is not what I want. I would like to have {key=value, ***}.

Any handy way to get it?

C# Solutions


Solution 1 - C#

If you just want to serialize for debugging purposes, the shorter way is to use String.Join:

var asString = string.Join(Environment.NewLine, dictionary);

This works because IDictionary<TKey, TValue> implements IEnumerable<KeyValuePair<TKey, TValue>>.

Example

Console.WriteLine(string.Join(Environment.NewLine, new Dictionary<string, string> {
    {"key1", "value1"},
    {"key2", "value2"},
    {"key3", "value3"},
}));
/*
[key1, value1]
[key2, value2]
[key3, value3]
*/

Solution 2 - C#

Try this extension method:

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

Solution 3 - C#

How about an extension-method such as:

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) + "}";
}

Example:

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

Console.WriteLine(dict.MyToString());

Output:

{4=a,5=b}

Solution 4 - C#

Maybe:

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

First you iterate each key-value pair and format it as you'd like to see as string, and later convert to array and join into a single string.

Solution 5 - C#

No handy way. You'll have to roll your own.

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();
}

Solution 6 - C#

I got this simple answer.. Use JavaScriptSerializer Class for this.

And you can simply call Serialize method with Dictionary object as argument.

Example:

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));

Output:

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

Solution 7 - C#

If you want to use Linq, you could try something like this:

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

where "test" is your dictionary. Note that the first parameter to Zip() is just a placeholder since a null cannot be passed).

If the format is not important, try

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

Which will give you something like

[key,value], [key,value],...

Solution 8 - C#

Another solution:

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);

Value of text: [A, 100], [B, 200], [C, 50]

Solution 9 - C#

You can loop through the Keys of the Dictionary and print them together with the value...

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

Solution 10 - C#

I like ShekHar_Pro's approach to use the serializer. Only recommendation is to use json.net to serialize rather than the builtin JavaScriptSerializer since it's slower.

Solution 11 - C#

I really like solutions with extension method above, but they are missing one little thing for future purpose - input parametres for separators, so:

    public static string ToPairString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string pairSeparator, string keyValueSeparator = "=")
    {
        return string.Join(pairSeparator, dictionary.Select(pair => pair.Key + keyValueSeparator + pair.Value));
    }

Example of using:

string result = myDictionary.ToPairString(Environment.NewLine, " with value: ");

Solution 12 - C#

What you have to do, is to create a class extending Dictionary and overwrite the ToString() method.

See you

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser705414View Question on Stackoverflow
Solution 1 - C#alexterceteView Answer on Stackoverflow
Solution 2 - C#Tim RogersView Answer on Stackoverflow
Solution 3 - C#AniView Answer on Stackoverflow
Solution 4 - C#Matías FidemraizerView Answer on Stackoverflow
Solution 5 - C#JSBձոգչView Answer on Stackoverflow
Solution 6 - C#Shekhar_ProView Answer on Stackoverflow
Solution 7 - C#seairthView Answer on Stackoverflow
Solution 8 - C#AreView Answer on Stackoverflow
Solution 9 - C#SyjinView Answer on Stackoverflow
Solution 10 - C#eeldivadView Answer on Stackoverflow
Solution 11 - C#BlaatoView Answer on Stackoverflow
Solution 12 - C#AmedioView Answer on Stackoverflow