如何将 C# 字典输出为 C# 代码?
How to Output a C# Dictionary as C# code?
如何将字典转换为定义该字典的 C# 代码? (类似于 python 中的 repr()
。)
示例:
var dict = new Dictionary<int, string> {
{ 4, "a" },
{ 5, "b" }
};
Console.WriteLine(dict.ToCsharpString());
输出:
Dictionary<int, string> {
{ 4, "a" },
{ 5, "b" }
}
我对包含基本类型的字典最感兴趣。
类似问题:Most efficient Dictionary.ToString() with formatting?(关注效率),有没有方便的将字典转换为字符串的方法?
(需要不同的输出格式)。
基于Gabe's answer一个相关问题,这里有一个扩展方法解决方案:
public static string ToCsharpString<TKey,TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> items) {
StringBuilder str = new StringBuilder();
string type_name = items.GetType().Name;
int index = type_name.LastIndexOf('`');
if (index == -1) {
index = type_name.Length;
}
str.Append(type_name, 0, index);
str.AppendFormat("<{0}, {1}>", typeof(TKey).Name, typeof(TValue).Name);
str.Append(" {\n");
foreach (var item in items) {
str.AppendFormat("\t{{ {0}, {1} }},\n", ToLiteral(item.Key), ToLiteral(item.Value));
}
str.Append("}");
return str.ToString();
}
static string ToLiteral(object obj) {
string input = obj as string;
if (input == null)
return obj.ToString();
//
using (var writer = new StringWriter()) {
using (var provider = CodeDomProvider.CreateProvider("CSharp")) {
provider.GenerateCodeFromExpression(new CodePrimitiveExpression(input), writer, null);
return writer.ToString();
}
}
}
输出略有不同,因为它打印框架 Class 库类型而不是基本类型(Int32
而不是 int
),但它工作得很好:
Dictionary<Int32, String> {
{ 4, "a" },
{ 5, "b" },
}
改进空间:
- 处理嵌入式字典的递归(但由于防止无限递归的复杂性,我认为这不值得)。
- 也许为非原始类型打印一些更好的东西?
如何将字典转换为定义该字典的 C# 代码? (类似于 python 中的 repr()
。)
示例:
var dict = new Dictionary<int, string> {
{ 4, "a" },
{ 5, "b" }
};
Console.WriteLine(dict.ToCsharpString());
输出:
Dictionary<int, string> {
{ 4, "a" },
{ 5, "b" }
}
我对包含基本类型的字典最感兴趣。
类似问题:Most efficient Dictionary.ToString() with formatting?(关注效率),有没有方便的将字典转换为字符串的方法? (需要不同的输出格式)。
基于Gabe's answer一个相关问题,这里有一个扩展方法解决方案:
public static string ToCsharpString<TKey,TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> items) {
StringBuilder str = new StringBuilder();
string type_name = items.GetType().Name;
int index = type_name.LastIndexOf('`');
if (index == -1) {
index = type_name.Length;
}
str.Append(type_name, 0, index);
str.AppendFormat("<{0}, {1}>", typeof(TKey).Name, typeof(TValue).Name);
str.Append(" {\n");
foreach (var item in items) {
str.AppendFormat("\t{{ {0}, {1} }},\n", ToLiteral(item.Key), ToLiteral(item.Value));
}
str.Append("}");
return str.ToString();
}
static string ToLiteral(object obj) {
string input = obj as string;
if (input == null)
return obj.ToString();
//
using (var writer = new StringWriter()) {
using (var provider = CodeDomProvider.CreateProvider("CSharp")) {
provider.GenerateCodeFromExpression(new CodePrimitiveExpression(input), writer, null);
return writer.ToString();
}
}
}
输出略有不同,因为它打印框架 Class 库类型而不是基本类型(Int32
而不是 int
),但它工作得很好:
Dictionary<Int32, String> {
{ 4, "a" },
{ 5, "b" },
}
改进空间:
- 处理嵌入式字典的递归(但由于防止无限递归的复杂性,我认为这不值得)。
- 也许为非原始类型打印一些更好的东西?