user705414
user705414

Reputation: 21200

Is there anyway to handy convert a dictionary to String?

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?

Upvotes: 147

Views: 166304

Answers (12)

alextercete
alextercete

Reputation: 5151

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]
*/

Upvotes: 233

Blaato
Blaato

Reputation: 129

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

Upvotes: 0

Tim Rogers
Tim Rogers

Reputation: 21713

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

Upvotes: 164

Are
Are

Reputation: 307

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]

Upvotes: 3

eeldivad
eeldivad

Reputation: 53

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.

Upvotes: 0

Ani
Ani

Reputation: 113402

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}

Upvotes: 14

seairth
seairth

Reputation: 2062

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],...

Upvotes: 3

Shekhar_Pro
Shekhar_Pro

Reputation: 18420

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"}

Upvotes: 4

JSBձոգչ
JSBձոգչ

Reputation: 41378

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

Upvotes: 9

Amedio
Amedio

Reputation: 895

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

See you

Upvotes: -5

Syjin
Syjin

Reputation: 2810

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

Upvotes: 0

Mat&#237;as Fidemraizer
Mat&#237;as Fidemraizer

Reputation: 64933

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.

Upvotes: 9

Related Questions