在.NET中将查询字符串转换为键值对

19
如果我有一个字符串,例如:
"Name=Irwin&Home=Caribbean&Preference=Coffee"

在C#中是否有一种方法可以将它转换为类似于Request.QueryString的键值对?


这有帮助吗?https://dev59.com/5HVD5IYBdhLWcg3wKYL- - MyDaftQuestions
5个回答

41
你可以尝试使用 HttpUtility.ParseQueryString
var nvc = HttpUtility.ParseQueryString(yourString);

1
不需要新建一个NVC,因为ParseQueryString已经返回了该类型。 - Oded
但据我所知,它不是客户端配置文件的一部分,这可能会成为一个问题。(在我发现ASP.NET标签之前发布的)。 - H H
在编写代码示例时,请避免使用“var”,因为它可能会让读者困惑返回了什么类型。如果是这种情况,请明确指定“string”。 - einord

19

现在,让我们来看一下最长的LINQ表达式...

var dict = "Name=Irwin&Home=Caribbean&Preference=Coffee"
    .Split('&')
    .Select(p => p.Split('='))
    .ToDictionary(p => p[0], p => p.Length > 1 ? Uri.UnescapeDataString(p[1]) : null);

但请注意,如果有多个相同名称的键,则会抛出异常。

如果您想要保护自己免受此类情况,请添加:

    .GroupBy(p => p[0]).Select(p => p.First())

.ToDictionary之前(并且在.Select之后),

这将获取多个键值对中的第一个key=value。将.First()改为.Last()以获取最后一个。


在我的情况下,这个回答比被采纳的回答更有帮助,因为我正在寻找解析 key:value[;key:value]... 样式字符串的情况。 - Bob Kaufman
实际上,这并不是一个非常长的LINQ表达式:-p。而且,如果这确实是打算解析类似查询字符串的东西,那么Uri.UnescapeDataString()的调用在哪里? - binki
1
@binki 你是对的(在第二个问题上) :-) 已添加...关于长度,后人会决定 :-) - xanatos
几乎——密钥也可以作为查询字符串以转义形式编写;-) - binki

7

您还可以使用ToDictionary()方法:

var input = "Name=Irwin&Home=Caribbean&Preference=Coffee";
var items = input.Split(new[] { '&' });
var dict = items.Select(item => item.Split(new[] {'='})).ToDictionary(pair => pair[0], pair => pair[1]);

1
如果您不想依赖于System.Web,例如,如果您正在为输入或输出类似查询字符串的格式的API开发,则这是正确的方法。 - Derreck Dean
1
似乎是Xamarin和Maui中HttpUtility方法的不错替代方案。 - Wolfgang Schreurs


1
你应该能够基于 & 和等号拆分这个字符串,然后将每个部分传入一个新的 KeyValuePair。
Dictionary<string, string> myValues = new Dictionary<string,string>();

string[] elements = myString.Split('=','&');

for(int i=0;i<elements.Length; i+=2)
{
   myValues.Add(elements[i], elements[i+1]);
}

这个方法很简单,但是它对于字符串格式做了很多假设,不过它可以解决你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接