有没有什么方法方便地将一个字典转换成字符串?

138

我发现字典的默认ToString实现并不是我想要的。我希望得到{key=value, ***}这样的格式。

有什么方便的方法可以实现吗?


4
这个字符串是仅供调试器可视化吗?还是打算让用户使用? - TreDubZedd
2
我认为JSON序列化器做得非常好。 - Shekhar_Pro
请参见https://dev59.com/XHA65IYBdhLWcg3wxRs8。 - Pavel Chuchuva
2
为了以后的参考,ToString 的默认实现看起来像这样:System.Collections.Generic.Dictionary``2[System.String,System.String] - Chris Long
12个回答

217

如果仅为了调试目的而进行序列化,则更短的方法是使用String.Join

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

这是行得通的,因为IDictionary<TKey, TValue>实现了IEnumerable<KeyValuePair<TKey, TValue>>

例子

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

非常好的运行。非常感谢你。 - Marty_in_a_Box
7
太棒了!这东西我这辈子都在哪里啊? - Tony
3
请注意,这需要.NET 4。 - cowlinator
3
不能与ListDictionary一起使用。除此之外很棒,已点赞。 - Alex from Jitbit
1
它对于简单类型非常有效。但是如果您的值是类,则必须找到另一种解决方案。@Matías Fidemraizer的答案可以在这种情况下提供帮助 https://dev59.com/dm025IYBdhLWcg3wnnYw#5899279 - GigaKatowice
太棒了,非常有效!谢谢。 - RShome

155

尝试使用此扩展方法:

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

1
我认为不需要使用 ToArray(),也不需要使用 ToString() - Steven Jeuris
3
如果您使用低于.NET 4.0版本,则确实需要使用ToArray()。 - Jack
1
就像Java中的map.toString()一样 ;) - Choletski

13

如何使用扩展方法:

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}

扩展方法:Breath(呼吸) - Matías Fidemraizer

9

也许:

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

首先,您需要迭代每个键值对,并将其格式化为您想要的字符串,然后将其转换为数组并连接成单个字符串。


8

没有简单的方法。你需要自己动手实现。

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
这很有帮助,因为它适用于没有LINQ支持的预.NET3.5代码。 - John Sibly

4

我得到了这个简单的答案.. 使用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));

输出:

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

3

另一种解决方案:

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]


3

如果您想使用Linq,可以尝试以下方法:

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

其中“test”是您的字典。请注意,Zip()的第一个参数只是一个占位符,因为不能传递空值。

如果格式不重要,请尝试使用

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

这将会给你类似于以下的结果:
[key,value], [key,value],...

我更喜欢@Tim提供的Linq表达式。 - seairth

0

我喜欢ShekHar_Pro使用序列化器的方法。唯一的建议是使用json.net进行序列化,而不是内置的JavaScriptSerializer,因为它更慢。


0

我非常喜欢使用扩展方法的解决方案,但是它们缺少一个小东西以备将来之需 - 分隔符的输入参数,因此:

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

使用示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接