Я виявив, що реалізація 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()) + "}";
}
ToArray()
, ні в ToString()
тому.
ToArray()
насправді потрібен, якщо ви використовуєте версію нижче NET 4.0
Якщо ви просто хочете провести серіалізацію для цілей налагодження, коротшим способом є використання 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]
*/
ListDictionary
. Інакше чудово, голос за голос
Як щодо методу розширення, такого як:
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))));
де "тест" - це ваш словник. Зверніть увагу, що перший параметр для Zip () - це просто заповнювач, оскільки нуль не може бути переданий).
Якщо формат не важливий, спробуйте
String.Join(",", test.OrderBy(kv => kv.Key));
Що дасть вам щось на зразок
[key,value], [key,value],...
Мені дуже подобаються рішення з методом розширення вище, але їм не вистачає однієї дрібниці для майбутнього - вхідних параметрів для роздільників, отже:
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()
метод.
Побачимось