无论如何要方便地将字典转换为字符串?

时间:2011-05-05 14:15:46

标签: c#

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

任何方便的方式来获得它?

12 个答案:

答案 0 :(得分:89)

试试这个扩展方法:

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

答案 1 :(得分:70)

如果您只是想序列化以进行调试,则更短的方法是:

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

这是有效的,因为IDictionary<TKey, TValue>ICollection<KeyValuePair<TKey, TValue>>

答案 2 :(得分: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}

答案 3 :(得分:7)

没有方便的方法。你必须自己动手。

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

答案 4 :(得分:4)

也许:

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

首先,迭代每个键值对并将其格式化为您希望看到的字符串,然后转换为数组并加入单个字符串。

答案 5 :(得分: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"}

答案 6 :(得分:3)

如果你想使用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],...

答案 7 :(得分: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]

答案 8 :(得分:0)

您可以遍历字典的键并将其与值...

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

答案 9 :(得分:0)

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

答案 10 :(得分: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: ");

答案 11 :(得分:-5)

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

见到你