2011-05-05 72 views
49

我发现字典中ToString的默认实现不是我想要的。我想有{key=value, ***}反正有方便地将字典转换为字符串吗?

任何方便的方法来获取它?

+3

这是一个只在调试器的可视化?或者这个字符串是面向用户的? – TreDubZedd 2011-05-05 14:18:29

+1

我认为这是由JSON串行器完成的很好 – 2011-05-05 14:23:41

+0

请参阅http://stackoverflow.com/questions/3639094/most-efficient-dictionaryk-v-tostring-with-formatting – 2011-10-07 11:52:51

回答

74

试试这个扩展方法:

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

I没有看到“ToArray()”的需要,也没有看到“ToString()”的需要。 – 2014-05-21 16:12:49

+1

@StevenJeuris:如果您使用的版本低于NET 4.0 – Jack 2014-12-05 18:51:45

+1

,那么确实需要'ToArray()',这与java中的map.toString()完全相同) – Choletski 2016-02-17 08:36:33

3

可能:

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

首先,你遍历每个键值对,并格式化,你想看到的字符串,后来转换成数组,并加入到一个单一的字符串。

10

如何扩展法例如:

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} 
+0

呼气并指定它是一种扩展方法:D – 2011-05-05 14:23:59

0

你可以通过字典的键,并打印出来环连同价值...

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

,你所要做的,是创建扩展Dictionary类并覆盖ToString()方法。

再见你

+0

我可以知道为什么有人指向-1? :)谢谢,如果我错了,我想我错了。谢谢。 – Amedio 2011-05-05 14:26:30

+1

我没有downvote这个答案,但它不提供示例代码。另外,如果您只需编写一些其他答案中显示的扩展方法,则子类似乎是不必要的锤子;这也允许你直接从你控制之外的代码中获得的字典上调用扩展方法,你不能只使用你的子类。 – Eliot 2016-04-22 00:52:14

6

没有方便的方法。你将不得不推出自己的。

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

这是有用的,因为它在.NET3.5之前的代码上工作(不支持linq) – 2013-12-04 12:40:47

2

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

如果你想使用LINQ的,你可以尝试这样的事:

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

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

如果格式并不重要,尝试

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

如果你只是想序列化调试的目的,这将给你像

[key,value], [key,value],... 
+0

我喜欢Linq表达式@Tim提供的更多内容。 – seairth 2011-05-05 14:58:03

52

,较短的方法是:

var asString = string.Join(";", dictionary); 

这是可行的,因为IDictionary<TKey, TValue>ICollection<KeyValuePair<TKey, TValue>>

+3

+1不真实漂亮,但它的工作原理很简单。 – 2014-06-03 18:49:39

+0

工程很好。非常感谢你。 – 2016-04-28 13:44:42

+3

太棒了!这是我一生的何去何从? – Tony 2017-01-27 17:41:42

0

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

+1

这应该是一个评论,而不是一个答案。请等到您有足够的信誉发表评论,而不是垃圾回答部分。 – Chris 2014-10-20 22:20:42

1

另一种解决方案:文本

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]