没有值的NameValueCollection键

4

我有一个NameValueCollection变量queryDict

有些键没有值。但是,我想遍历所有的键,即使它们没有与之关联的值。

使用下面的代码,如果值为空,则返回null而不是键名:

foreach (var parameter in queryDict)
{
  key = (string)parameter;
}

AllKeys可以获取所有的结果。

但是我也得到了 null。查看 queryDict 的内容,我可以看到字符串中有值……

那么如何访问所有的键名而不需要创建算法呢?

补充:

当鼠标悬停时,以下是 queryDict 的内容:

{AQB=1&ndh=1&cid.&oxygenid}

在循环中找不到 cid. 和 oxygenid。

我是这样填充它的:

string queryString = "AQB=1&ndh=1&cid.&oxygenid";
NameValueCollection queryDict = System.Web.HttpUtility.ParseQueryString(queryString);

一个NameValueCollection允许您添加具有相同键的多个值,但是如果您添加了一个具有null值的键,然后再次添加具有非null值的相同键,则第一个将不再可用。 - Steve
4个回答

3

一个NameValueCollection允许您添加具有相同键的多个值,但是如果您添加了一个空值的键,然后再次添加带有非空值的相同键,则第一个值(即空值)将不再可用

让我们测试一些情况:

NameValueCollection coll = new NameValueCollection();
coll.Add("This", "Test");
coll.Add("That", "A value");
coll.Add("This", "Not a null");

foreach (string p in coll.AllKeys)
{
    Console.WriteLine("Key=" + p + ", Value=[" + (coll[p] ?? "null") + "]");
}

我们得到的输出是:
Key=This, Value=[Test,Not a null]
Key=That, Value=[A value]

所以,该对象已将两个“add”操作的值合并到单个条目中,并用逗号分隔两个值。
现在让我们尝试一下。
coll.Add("This", null);
coll.Add("That", "A value");
coll.Add("This", "Not a null");

输出结果为:
Key=This, Value=[Not a null]
Key=That, Value=[A value]

第一次添加的内容没有痕迹。为什么会这样呢?因为 Add 方法的内部逻辑在合并值时无法区分最初的 null 值和第一次添加的 null 值。所以它只是用“非空”字符串替换了 null 值。

实际上,注释掉最后一次添加:

coll.Add("This", null);
coll.Add("That", "A value");
// coll.Add("This", "Not a null");

我们得到
Key=This, Value=[null]
Key=That, Value=[A value]

谢谢您的解释。我尝试了这段代码,您是正确的。看起来问题出在我填充参数的方式上(我在我的帖子中添加了一些内容)。有没有办法使用ParseQueryString,使没有值的参数不被忽略? - Cher
ParseQueryString会将没有值的参数视为空字符串("")而不是null值。因此,如果没有值,它会返回带有空字符串的键。但是您的示例输入无效。要正确使用ParseQueryString,您应该使用"_“AQB=1&ndh=1&cid=&oxygenid=”;_”。 - Steve
谢谢你的所有帮助!以这种方式做有点糟糕...虽然不难,但我本来期望parsequerstring返回参数。 - Cher
谢谢你的准确回答!我可以问一下什么是被认为是 .oxyid 吗?它的作用是什么? - Cher
让我们在聊天中继续这个讨论 - Steve
显示剩余2条评论

0

使用 ?? 空值合并运算符。如果左操作数不为 null,则返回左操作数;否则返回右操作数。


谢谢!我可以问一下在代码中我应该把这个写在哪里吗? - Cher

0

我想遍历所有的键 你应该遍历这些键:

foreach (var parameter in queryDict.Keys)

我所做的与之前相同。我仍然不明白没有参数的关键字。 - Cher

0

尝试这个并查看它是否有效。您可以使用NameValueCollection.AllKeys循环遍历键,而不返回任何重复项。

foreach (var parameter in queryDict.AllKeys) { key = parameter; }

它也不返回值为空的键。它做的和我一样。 - Cher
你的对象中可能有“null键”。NameValueCollection 允许重复/空的键。否则,这应该可以工作。 - Meet Shah
密钥不为空。我将在一分钟内添加queryDict的内容。 - Cher

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