【问题标题】:How to split string into a dictionary如何将字符串拆分为字典
【发布时间】:2009-12-05 13:27:38
【问题描述】:

我有这个字符串

string sx="(colorIndex=3)(font.family=Helvetica)(font.bold=1)";

并与它分开

string [] ss=sx.Split(new char[] { '(', ')' },
    StringSplitOptions.RemoveEmptyEntries);

除此之外,我如何将结果拆分为Dictionary<string,string>?这 结果字典应如下所示:

Key          Value
colorIndex   3
font.family  Helvetica
font.bold    1

【问题讨论】:

    标签: c# c#-3.0


    【解决方案1】:

    可以使用 LINQ ToDictionary() 扩展方法来完成:

    string s1 = "(colorIndex=3)(font.family=Helvicta)(font.bold=1)";
    string[] t = s1.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries);
    
    Dictionary<string, string> dictionary =
                          t.ToDictionary(s => s.Split('=')[0], s => s.Split('=')[1]);
    

    编辑:不拆分两次也能达到同样的效果:

    Dictionary<string, string> dictionary =
               t.Select(item => item.Split('=')).ToDictionary(s => s[0], s => s[1]);
    

    【讨论】:

    • 甚至不知道Split函数可以将字符串数组作为参数。整洁。
    • 有什么办法可以避免两次调用s.Split()?
    • 当然,通过调用 t.Select(item => item.Split('=')).ToDictionary(s => s[0], s => s[1]);类似于@erikkallen 和@Luke 的答案。
    • @Snickbrack,因为我完全忘记了这个答案:) 我已经编辑,现在答案包含评论。谢谢!
    【解决方案2】:

    可能有更有效的方法,但这应该有效:

    string sx = "(colorIndex=3)(font.family=Helvicta)(font.bold=1)";
    
    var items = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
        .Select(s => s.Split(new[] { '=' }));
    
    Dictionary<string, string> dict = new Dictionary<string, string>();
    foreach (var item in items)
    {
        dict.Add(item[0], item[1]);
    }
    

    【讨论】:

      【解决方案3】:

      Randal Schwartz 有一个rule of thumb:当您知道要丢弃什么时使用 split 或当您知道要保留什么时使用正则表达式。

      你知道你想保留什么:

      string sx="(colorIndex=3)(font.family=Helvetica)(font.bold=1)";
      
      Regex pattern = new Regex(@"\((?<name>.+?)=(?<value>.+?)\)");
      
      var d = new Dictionary<string,string>();
      foreach (Match m in pattern.Matches(sx))
        d.Add(m.Groups["name"].Value, m.Groups["value"].Value);
      

      稍加努力,ToDictionary就可以做到:

      var d = Enumerable.ToDictionary(
        Enumerable.Cast<Match>(pattern.Matches(sx)),
        m => m.Groups["name"].Value,
        m => m.Groups["value"].Value);
      

      不确定这是否更好看:

      var d = Enumerable.Cast<Match>(pattern.Matches(sx)).
        ToDictionary(m => m.Groups["name"].Value,
                     m => m.Groups["value"].Value);
      

      【讨论】:

        【解决方案4】:
        string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)";
        
        var dict = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
                     .Select(x => x.Split('='))
                     .ToDictionary(x => x[0], y => y[1]);
        

        【讨论】:

        • 嗯,我只是注意到这在功能上与 erikkallen 的答案相同,但使用的是扩展方法语法而不是查询语法。
        • @Luke,对我来说,你的答案更具可读性,但这可能只是格式化。
        • @Tuzo:我通常也更喜欢扩展方法语法,但我认为这完全取决于个人喜好。
        • 卢克,为什么字典应该是匿名类型,为什么不能是字典谢谢 - 托尼
        • @unknown: dict 是 Dictionary&lt;string, string&gt;。在这种情况下,var 关键字与匿名类型无关,它只是意味着编译器确定 dict 实际上是一个字典,从而为我节省了一些输入!生成的代码完全与我用Dictionary&lt;string, string&gt; dict 等声明它一样。msdn.microsoft.com/en-us/library/bb383973.aspx
        【解决方案5】:
        var dict = (from x in s1.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
                    select new { s = x.Split('=') }).ToDictionary(x => x[0], x => x[1]);
        

        【讨论】:

          【解决方案6】:

          常用于http查询拆分。

          Usage: Dictionary<string, string> dict = stringToDictionary("userid=abc&password=xyz&retain=false");
          
          public static Dictionary<string, string> stringToDictionary(string line, char stringSplit = '&', char keyValueSplit = '=')
          {
              return line.Split(new[] { stringSplit }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Split(new[] { keyValueSplit })).ToDictionary(x => x[0], y => y[1]); ;
          }
          

          【讨论】:

            【解决方案7】:

            你可以试试

            string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)";
            
            var keyValuePairs = sx.Split(new[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
                        .Select(v => v.Split('='))
                        .ToDictionary(v => v.First(), v => v.Last());
            

            【讨论】:

              【解决方案8】:

              你可以用正则表达式做到这一点:

              string sx = "(colorIndex=3)(font.family=Helvetica)(font.bold=1)";
              
              Dictionary<string,string> dic = new Dictionary<string,string>();
              
              Regex re = new Regex(@"\(([^=]+)=([^=]+)\)");
              
              foreach(Match m in re.Matches(sx))
              {
                  dic.Add(m.Groups[1].Value, m.Groups[2].Value);
              }
              
              // extract values, to prove correctness of function
              foreach(var s in dic)
                  Console.WriteLine("{0}={1}", s.Key, s.Value);
              

              【讨论】:

                【解决方案9】:

                我只是把这个放在这里以供参考......

                对于 ASP.net,如果您想将来自客户端的字符串解析为字典,这很方便...

                在客户端创建一个 JSON 字符串,如下所示:

                var args = "{'A':'1','B':'2','C':'" + varForC + "'}";
                

                或者像这样:

                var args = JSON.stringify(new { 'A':1, 'B':2, 'C':varForC});
                

                甚至像这样:

                var obj = {};
                obj.A = 1;
                obj.B = 2;
                obj.C = varForC;
                var args = JSON.stringify(obj);
                

                将其传递给服务器...

                然后像这样在服务器端解析它:

                 JavaScriptSerializer jss = new JavaScriptSerializer();
                 Dictionary<String, String> dict = jss.Deserialize<Dictionary<String, String>>(args);
                

                JavaScriptSerializer 需要 System.Web.Script.Serialization。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-06-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-05-14
                  相关资源
                  最近更新 更多