3

我有一个NameValueCollection变量queryDict

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

使用它,如果值为空,我会得到 null 而不是键名:

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

AllKeys产生所有结果。

不过我也明白了null。查看 的内容queryDict,我可以通过字符串看到值在那里......

那么如何在不需要创建算法的情况下访问所有密钥名称呢?

添加:

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

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

cid。并且在循环中没有找到氧气

我是这样填写的:

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

4 回答 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]

因此,该对象将两个加法的值合并到一个条目中,用逗号分隔两个值。现在让我们尝试

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 的初始值和第一次 add 添加的 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]
于 2017-10-12T18:50:39.067 回答
0

I would like to go through all keys您应该循环遍历这些键:

foreach (var parameter in queryDict.Keys)
于 2017-10-12T18:24:57.860 回答
0

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

foreach (var parameter in queryDict.AllKeys) { key = parameter; }
于 2017-10-12T18:26:24.380 回答
0

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

于 2017-10-12T18:30:32.730 回答