反正有方便地将字典转换为String吗?


Answers:


115

尝试以下扩展方法:

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 2014年

3
@StevenJeuris:ToArray()如果您使用的是低于NET 4.0的版本,则确实需要
Jack

1
完全像java中的map.toString();)
Choletski '16

114

如果仅出于调试目的而序列化,则较短的方法是使用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

6
辉煌!我这辈子在哪里?
托尼

3
请注意,这需要.NET 4
cowlinator'Apr 10''17

2
不适用于ListDictionary。否则很棒,令人发指
Alex

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}

呼气,并指定这是一个扩展方法:d
马蒂亚斯Fidemraizer

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
这很有用,因为它适用于.NET3.5之前的代码(无linq支持)
John Sible

4

也许:

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

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


3

我得到了这个简单的答案。 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],...

我喜欢Linq表达式@Tim提供了更多。
seairth 2011年

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]


0

您可以循环浏览字典的键,并将它们与值一起打印...

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

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

-5

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

再见


我可以知道为什么有人为此指向-1吗?:)谢谢,如果我错了,我想我错了。谢谢。
阿米迪奥(Amedio)

3
我没有拒绝这个答案,但是它没有提供示例代码。同样,当您可以像其他一些答案中所示编写扩展方法时,子类化似乎是不必要的锤子。这也使您可以直接在无法从控件之外的代码中获取的字典上调用扩展方法,而这些代码将无法仅使用子类。
艾略特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.