【发布时间】:2014-07-04 09:58:34
【问题描述】:
我有以下代码来解析 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]);
}
输出:
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");
var item = args.Get("array").Get(0).Get("b"); // will be "2"
实现此目的最优雅的方法是什么?我更喜欢没有 System.Web 或任何额外参考的解决方案。
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
不使用专为某项任务设计的库通常会让自己的生活变得不必要地困难
-
@BenAaronson 你是对的,但我希望我的应用程序与 4.0 客户端配置文件兼容。无论如何,我也会对 System.Web 解决方案感到满意!
-
@cahinton 我看过那个问题,没有提到查询字符串中编码的数组。