首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将C#字典输出为C#代码?

如何将C#字典输出为C#代码?
EN

Stack Overflow用户
提问于 2019-07-18 18:47:46
回答 1查看 203关注 0票数 0

如何将字典转换为定义该字典的C#代码?(类似于python中的repr()。)

示例:

代码语言:javascript
复制
var dict = new Dictionary<int, string> {
    { 4, "a" },
    { 5, "b" }
};

Console.WriteLine(dict.ToCsharpString());

输出:

代码语言:javascript
复制
Dictionary<int, string> {
    { 4, "a" },
    { 5, "b" }
}

我最感兴趣的是包含原始类型的字典。

类似的问题:格式化的最有效的Dictionary.ToString()? (专注于效率),是否有方便地将字典转换为字符串? (想要不同的输出格式)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-18 18:47:46

基于有关问题的加布的回答,下面是一个扩展方法解决方案:

代码语言:javascript
复制
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();

    // https://stackoverflow.com/a/324812/79125
    using (var writer = new StringWriter()) {
        using (var provider = CodeDomProvider.CreateProvider("CSharp")) {
            provider.GenerateCodeFromExpression(new CodePrimitiveExpression(input), writer, null);
            return writer.ToString();
        }
    }
}

输出略有不同,因为它打印框架类库类型而不是原始类型(Int32而不是int),但是它运行得很好:

代码语言:javascript
复制
Dictionary<Int32, String> {
    { 4, "a" },
    { 5, "b" },
}

试一试。

有待改进的地方:

  • 处理嵌入式字典上的递归(但由于防止无限递归的复杂性,我认为这不值得)。
  • 也许能为非原始类型打印更好的东西?
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57100909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档