【问题标题】:How to split a string for key value pairs and save them to a dictionary? [duplicate]如何拆分键值对的字符串并将它们保存到字典中? [复制]
【发布时间】:2019-08-15 02:53:31
【问题描述】:

我有以下代码,可以很好地拆分字符串并将键值对保存到字典中。有没有更优雅、更有效的方法来做同样的事情?谢谢!

    private void SplitString()
    {
        string testConfig = "application?test1=value1&test2=value2&test3=value3";

        var dict = new Dictionary<string, string>();

        if (!string.IsNullOrEmpty(testConfig) && testConfig.Contains("?"))
        {
            string parameters = testConfig.Substring(testConfig.LastIndexOf("?") + 1);

            string[] parameterArray = parameters.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries);

            if (parameterArray.Length > 0)
            {
                foreach (var item in parameterArray)
                {
                    string[] param = item.Split(new char[] { '=' });

                    if (param.Length == 2)
                    {
                        switch (param[0].ToUpper())
                        {
                            case "TEST1":
                                dict.Add("TEST1", param[1]);
                                break;
                            case "TEST2":
                                dict.Add("TEST2", param[1]);
                                break;
                            case "TEST3":
                                dict.Add("TEST3", param[1]);
                                break;
                        }
                    }
                }
            }
        }
    }

【问题讨论】:

  • 是的。 var dict = HttpUtility.ParseQueryString(testConfig).
  • 如果您正在解析 URL 或 URL 编码的标签/值对列表,我强烈建议您使用经过验证的工具。这个问题比看起来更难。请记住,需要担心特殊字符、分隔符和转义序列,甚至是潜在的注入威胁。

标签: c# .net


【解决方案1】:

您似乎正在尝试将查询字符串拆分为查询参数字典。您应该能够使用HttpUtility.ParseQueryString 方法。请注意,此方法返回一个NameValueCollection。该对象可能对您有用,但如果您需要Dictionary,您可以使用简单的for 循环将NameValueCollection 转换为Dictionary

此外,如果您出于某种原因决定坚持使用原始代码,则可以大大简化此代码:

switch (param[0].ToUpper())
{
    case "TEST1":
        dict.Add("TEST1", param[1]);
        break;
    case "TEST2":
        dict.Add("TEST2", param[1]);
        break;
    case "TEST3":
        dict.Add("TEST3", param[1]);
        break;
}

您不需要为每个可能的值使用单独的case。相反,您可以简单地这样写:

dict.Add(param[0].ToUpper(), param[1]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 2018-06-10
    • 2018-11-06
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2016-10-22
    • 2014-03-21
    相关资源
    最近更新 更多