【问题标题】:Is there anyway to handy convert a dictionary to String?无论如何可以方便地将字典转换为字符串?
【发布时间】:2011-08-19 10:36:20
【问题描述】:

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

有什么方便的方法吗?

【问题讨论】:

  • 这仅用于调试器中的可视化吗?还是这个字符串是面向用户的?
  • 我觉得这个JSON序列化器做得很好
  • 为了将来参考,默认的ToString 实现如下所示:System.Collections.Generic.Dictionary``2[System.String,System.String]

标签: c# dictionary tostring


【解决方案1】:

如果你只是为了调试目的而想序列化,更短的方法是使用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]
*/

【讨论】:

  • 效果很好。非常感谢。
  • 太棒了!我的一生都在哪里?
  • 请注意,这需要 .NET 4
  • 不适用于ListDictionary。否则很棒,点赞
  • 它适用于简单类型。但是,如果您的价值观是类,则必须找到另一种解决方案。 @Matías Fidemraizer 的回答可以在这种情况下提供帮助 stackoverflow.com/a/5899279/2028619
【解决方案2】:

试试这个扩展方法:

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

【讨论】:

  • 我认为不需要ToArray(),也不需要ToString()
  • @StevenJeuris: ToArray() 确实需要,如果您使用的版本低于 NET 4.0
  • 完全像 java 中的 map.toString() ;)
【解决方案3】:

如何扩展方法,例如:

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
【解决方案4】:

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

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

【讨论】:

  • 这很有帮助,因为它适用于 .NET3.5 之前的代码(没有 linq 支持)
【解决方案5】:

也许:

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

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

【讨论】:

    【解决方案6】:

    我得到了这个简单的答案。使用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"}
    

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 我更喜欢@Tim 提供的 Linq 表达式。
      【解决方案8】:

      另一种解决方案:

      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]

      【讨论】:

        【解决方案9】:

        您可以遍历字典的键并将它们与值一起打印...

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

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

            我真的很喜欢上面带有扩展方法的解决方案,但是为了将来的目的,它们缺少了一件小东西——分隔符的输入参数,所以:

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

            【讨论】:

              【解决方案12】:

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

              再见

              【讨论】:

              • 我想知道为什么有人将-1指向这个吗? :) 谢谢,如果我错了,我想我错了。谢谢。
              • 我没有否决这个答案,但它没有提供示例代码。此外,当您可以编写扩展方法时,子类化似乎是不必要的锤子,如其他一些答案所示;这还允许您直接在字典上调用扩展方法,这些字典是从您无法控制的代码中获取的,您无法只使用您的子类。
              猜你喜欢
              • 1970-01-01
              • 2019-11-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-12-06
              • 2011-01-10
              相关资源
              最近更新 更多