Linq将字符串转换为Dictionary <string,string> </string,string>

时间:2011-09-05 10:29:40

标签: c# linq dictionary

我正在使用字典来保存一些参数,我发现不可能序列化任何实现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);
    }
}

6 个答案:

答案 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)

一种选择是:

  1. 'Convert' the Dictionary to a NameValueCollection
  2. 使用以下代码convert the NameValueCollection into a HttpValueCollection

    var parserCollection = HttpUtility.ParseQueryString(string.Empty); parserCollection.Add(yourNameValueCollection);

  3. parserCollection.ToString()将生成一个(url编码的)字典的字符串版本。
  4. 要将字符串形式转换回NameValueCollection,请使用HttpUtility.ParseQueryString(stringFormOfYourDictionary)。然后执行与步骤1相反的操作,将NameValueCollection转换回Dictionary。

    这样做的好处是无论Dictionary的内容如何,​​它都能正常工作。不依赖于数据的格式(因此无论字典中的键值或值如何,它都能正常工作)。