Я обнаружил, что стандартная реализация ToString в словаре не то, что я хочу. Я хотел бы иметь {key=value, ***}
.
Любой удобный способ его получить?
Я обнаружил, что стандартная реализация ToString в словаре не то, что я хочу. Я хотел бы иметь {key=value, ***}
.
Любой удобный способ его получить?
Попробуйте использовать этот метод расширения:
public static string ToDebugString<TKey, TValue> (this IDictionary<TKey, TValue> dictionary)
{
return "{" + string.Join(",", dictionary.Select(kv => kv.Key + "=" + kv.Value).ToArray()) + "}";
}
Если вы просто хотите сериализоваться для целей отладки, более короткий путь - использовать String.Join
:
var asString = string.Join(";", dictionary);
Это работает, потому что IDictionary<TKey, TValue>
реализует IEnumerable<KeyValuePair<TKey, TValue>>
.
Как насчет метода расширения, например:
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}
Нет удобного способа. Вам придется сворачивать самостоятельно.
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();
}
Может быть:
string.Join
(
",",
someDictionary.Select(pair => string.Format("{0}={1}", pair.Key.ToString(), pair.Value.ToString())).ToArray()
);
Сначала вы повторяете каждую пару значений ключа и форматируете его так, как хотите видеть в виде строки, а затем конвертируете в массив и объединяете в одну строку.
Я получил этот простой ответ. Используйте JavaScriptSerializer
Класс для этого.
И вы можете просто вызвать метод Serialize с объектом Dictionary в качестве аргумента.
Пример:
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"}
Если вы хотите использовать 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],...
Другое решение:
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]
Вы можете прокручивать ключи Словаря и печатать их вместе со значением...
public string DictToString(Dictionary<string, string> dict)
{
string toString = "";
foreach (string key in dict.Keys)
{
toString += key + "=" + dict[key];
}
return toString;
}
Мне нравится подход ShekHar_Pro для использования сериализатора. Только рекомендация - использовать json.net для сериализации, а не встроенного JavaScriptSerializer, поскольку он медленнее.
Мне действительно нравятся решения с методом расширения, описанным выше, но в них отсутствует одна мелочь для будущих целей - входные параметры для разделителей, поэтому:
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: ");
Что вам нужно сделать, это создать класс, расширяющий Dictionary
и перезаписать метод ToString()
.
Увидимся