Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将URL数组参数解析为C#字典_C#_.net_Http_Url - Fatal编程技术网

将URL数组参数解析为C#字典

将URL数组参数解析为C#字典,c#,.net,http,url,C#,.net,Http,Url,我有以下代码来解析URL中的键值对: public static NameValueCollection ParseQueryString(String query) { NameValueCollection queryParameters = new NameValueCollection(); string[] querySegments = query.Split('&'); foreach (string segm

我有以下代码来解析URL中的键值对:

    public static NameValueCollection ParseQueryString(String query)
    {
        NameValueCollection queryParameters = new NameValueCollection();
        string[] querySegments = query.Split('&');
        foreach (string segment in querySegments)
        {
            string[] parts = segment.Split('=');
            if (parts.Length > 0)
            {
                string key = parts[0].Trim(new char[] { '?', ' ' });
                string val = parts[1].Trim();

                queryParameters.Add(key, val);
            }
        }

        return queryParameters;
    }
我是这样使用这个函数的:

args = ParseQueryString("alpha=1&beta=bbbb&array%5B0%5D%5Ba%5D=1&array%5B0%5D%5Bb%5D=2&array%5B1%5D%5Ba%5D=1&array%5B1%5D%5Bb%5D=2&array%5B%5D=3&array%5B%5D=4");
foreach (var k in args.AllKeys)
{
    tw.WriteLine(k + ": " + args[k]);
}
args = ParseQueryString("alpha=1&beta=bbbb&array%5B0%5D%5Ba%5D=1&array%5B0%5D%5Bb%5D=2&array%5B1%5D%5Ba%5D=1&array%5B1%5D%5Bb%5D=2&array%5B%5D=3&array%5B%5D=4");
var item = args.Get("array").Get(0).Get("b"); // will be "2"
输出:

alpha: 1
beta: bbbb
array[0][a]: 1
array[0][b]: 2
array[1][a]: 1
array[1][b]: 2
array[]: 3,4
我需要一个嵌套NameValueCollections或嵌套字典的输出,这样我就可以像这样访问这些值:

args = ParseQueryString("alpha=1&beta=bbbb&array%5B0%5D%5Ba%5D=1&array%5B0%5D%5Bb%5D=2&array%5B1%5D%5Ba%5D=1&array%5B1%5D%5Bb%5D=2&array%5B%5D=3&array%5B%5D=4");
foreach (var k in args.AllKeys)
{
    tw.WriteLine(k + ": " + args[k]);
}
args = ParseQueryString("alpha=1&beta=bbbb&array%5B0%5D%5Ba%5D=1&array%5B0%5D%5Bb%5D=2&array%5B1%5D%5Ba%5D=1&array%5B1%5D%5Bb%5D=2&array%5B%5D=3&array%5B%5D=4");
var item = args.Get("array").Get(0).Get("b"); // will be "2"

实现这一目标最优雅的方法是什么?我更喜欢没有System.Web或任何额外参考的解决方案。

如果使用ASP.NET MVC Framework,默认的MVC参数绑定器可以按以下方式自动处理:

// GetData?filters[0][field]=fieldName&filters[0][type]=number&filters[0][value]=3
public ActionResult GetData(IEnumerable<Dictionary<string,string>> filters) 
{
    // todo
}
//GetData?过滤器[0][field]=fieldName和过滤器[0][type]=number和过滤器[0][value]=3
public ActionResult GetData(IEnumerable筛选器)
{
//待办事项
}

有关更多信息和示例,请查看我在这个主题上写的内容。

我已编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。不使用专门为某项任务设计的库通常会给你自己的生活带来不必要的困难。可能是@BenAaronson的副本,你是对的,但我希望我的应用程序与4.0客户端配置文件兼容。无论如何,我会很高兴有一个系统。网络解决方案也@cahinton我看到了这个问题,没有提到查询字符串中编码的数组。