我正在使用字典来保存一些参数,我发现不可能序列化任何实现IDictionary(unable to serialize IDictionary)的内容。
作为一种解决方法,我想将字典转换为字符串以进行序列化,然后在需要时转换回字典。
因为我正在努力改善我的LINQ,这似乎是一个很好的地方,但我不知道如何开始。
这是我在没有LINQ的情况下实现它的方法:
/// <summary>
/// Get / Set the extended properties of the FTPS processor
/// </summary>
/// <remarks>Can't serialize the Dictionary object so convert to a string (http://msdn.microsoft.com/en-us/library/ms950721.aspx)</remarks>
public Dictionary<string, string> FtpsExtendedProperties
{
get
{
Dictionary<string, string> dict = new Dictionary<string, string>();
// Get the Key value pairs from the string
string[] kvpArray = m_FtpsExtendedProperties.Split('|');
foreach (string kvp in kvpArray)
{
// Seperate the key and value to build the dictionary
string[] pair = kvp.Split(',');
dict.Add(pair[0], pair[1]);
}
return dict;
}
set
{
string newProperties = string.Empty;
// Iterate through the dictionary converting the value pairs into a string
foreach (KeyValuePair<string,string> kvp in value)
{
newProperties += string.Format("{0},{1}|", kvp.Key, kvp.Value);
}
// Remove the last pipe serperator
newProperties = newProperties.Substring(0, newProperties.Length - 1);
}
}
答案 0 :(得分:10)
尝试这样的事情
var dict = str.Split(';')
.Select(s => s.Split(':'))
.ToDictionary(a => a[0].Trim(), a => a[1].Trim()));
对于以下类型的字符串,以上是正确的
"mykey1:myvalue1; mykey2:value2;...."
答案 1 :(得分:3)
在您的代码的上下文中
/// Get / Set the extended properties of the FTPS processor
/// </summary>
/// <remarks>Can't serialize the Dictionary object so convert to a string (http://msdn.microsoft.com/en-us/library/ms950721.aspx)</remarks>
public Dictionary<string, string> FtpsExtendedProperties
{
get
{
Dictionary<string, string> dict = m_FtpsExtendedProperties.Split('|')
.Select(s => s.Split(','))
.ToDictionary(key => key[0].Trim(), value => value[1].Trim());
return dict;
}
set
{
// NOTE: for large dictionaries, this can use
// a StringBuilder instead of a string for cumulativeText
// does not preserve Dictionary order (if that is important - reorder the String.Format)
string newProperties =
value.Aggregate ("",
(cumulativeText,kvp) => String.Format("{0},{1}|{2}", kvp.Key, kvp.Value, cumulativeText));
// Remove the last pipe serperator
newProperties = newProperties.Substring(0, newProperties.Length - 1);
}
}
没有对此进行过测试,但所使用的功能应该让您对如何使用LINQ简洁明了地进行操作
答案 2 :(得分:2)
另一种选择是使用linq-to-xml来完成繁重工作以确保所有内容都正确解析。
从:
开始var dict = new Dictionary<string, string>()
{
{ "A", "a" },
{ "B", "b" },
{ "C", "c" },
};
您可以通过以下方式将其转换为xml:
var xe = new XElement("d",
from kvp in dict
select new XElement("p",
new XAttribute("k", kvp.Key),
new XAttribute("v", kvp.Value))).ToString();
哪个成为:
<d>
<p k="A" v="a" />
<p k="B" v="b" />
<p k="C" v="c" />
</d>
要将其转回字典,请使用以下命令:
var dict2 = XDocument
.Parse(xml)
.Root
.Elements("p")
.ToDictionary(
x => x.Attribute("k").Value,
x => x.Attribute("v").Value);
简单,是吗?
此方法将避免需要专门转义特殊字符,如“|”或“;”。
答案 3 :(得分:1)
尝试以下代码
string vals = "a|b|c|d|e";
var dict = vals.Split('|').ToDictionary(x=>x);
dict
将为您提供包含五个条目的字典。
答案 4 :(得分:1)
为了您学习LINQ,我还包括序列化
var serialized = string.Join("|",from pair in value
select string.Format("{0},{1}", pair.Key, pair.Value);
var deserialized = new Dictionary<string,string(
from pair in serialized.Split("|")
let tokens = pair.Split(",")
select new KeyValuePair<string,string>(tokens[0],tokens[1]));
答案 5 :(得分:0)
一种选择是:
使用以下代码convert the NameValueCollection into a HttpValueCollection。
var parserCollection = HttpUtility.ParseQueryString(string.Empty); parserCollection.Add(yourNameValueCollection);
要将字符串形式转换回NameValueCollection,请使用HttpUtility.ParseQueryString(stringFormOfYourDictionary)。然后执行与步骤1相反的操作,将NameValueCollection转换回Dictionary。
这样做的好处是无论Dictionary的内容如何,它都能正常工作。不依赖于数据的格式(因此无论字典中的键值或值如何,它都能正常工作)。