2011-05-05 71 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]