有什么方法可以方便地将字典转换成字符串吗?

我发现字典中 ToString 的默认实现并不是我想要的。我想有 {key=value, ***}

有什么好办法吗?

121570 次浏览

也许:

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

首先迭代每个键-值对,并将其格式设置为希望看到的字符串,然后将其转换为数组并连接成单个字符串。

如何使用扩展方法,比如:

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

Output:

{4=a,5=b}

您可以循环通过字典的键并将它们与值一起打印..。

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

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

您必须做的是创建一个扩展 Dictionary的类并覆盖 ToString()方法。

再见

没有便捷的方法,你得自己卷。

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

我得到了这个简单的答案. . 使用 JavaScriptSerializer类为此。

您可以简单地使用 Dictionary 对象作为参数调用 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"}

如果你想使用 Linq,你可以试试这样的东西:

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

“ test”就是你的字典。注意,Zip ()的第一个参数只是一个占位符,因为不能传递 null)。

如果格式不重要,请尝试

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

这样你就会得到

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

如果只是为了调试目的而序列化,那么较短的方法是使用 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]
*/

我喜欢 ShekHar _ Pro 使用序列化器的方法。唯一的建议是使用 json.net 来序列化,而不是使用内置的 JavaScriptSerializer,因为它比较慢。

另一个解决办法:

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]

我非常喜欢上面提到的带有扩展方法的解决方案,但是它们缺少了一个小东西——分隔符的输入参数,所以:

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