【问题标题】:NameValueCollection key without valueNameValueCollection 键没有值
【发布时间】:2017-10-13 03:24:28
【问题描述】:

我有一个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 允许您使用相同的键添加多个值,但是如果您添加具有空值的键,然后再次读取具有非空值的相同键,则第一个是没有更多可用的

标签: c# namevaluecollection


【解决方案1】:

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]

【讨论】:

  • 感谢您的解释。我试过这段代码,你是对的。然后似乎是由于我填写它的方式(我在我的帖子中做了一个补充)。有没有办法使用 ParseQueryString 这样没有值的参数不会被忽略?
  • 好吧,ParseQueryString 会将没有值的参数视为空字符串 ("") 而不是空值。所以是的,如果没有值,它会返回带有空字符串的键。但是您的示例输入无效。要正确使用 ParseQueryString,您应该具有 "AQB=1&ndh=1&cid=&oxygenid=";
  • 特别是这可以更好地解释您的一些问题。当您将字符串 "AQB=1&ndh=1&cid.&oxygenid" 传递给 ParseQueryString 时,您会在集合中获得第三个键“null”,其中两个字符串作为值“cid”。和“氧气”。这似乎表明 ParseQueryString 无法确定键并将输入用作空键的值。
  • 感谢所有的帮助!!我必须这样做有点糟糕......这并不难,但我希望 parsequerstring 返回参数
  • 我不是专家,但要被视为查询字符串中的参数,您需要 =
【解决方案2】:

I would like to go through all keys 然后你应该遍历这些键:

foreach (var parameter in queryDict.Keys)

【讨论】:

  • 我做的是一样的。我仍然没有得到没有参数的密钥
【解决方案3】:

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

【讨论】:

  • 谢谢!!请问这个代码在哪里写??
【解决方案4】:

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

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

【讨论】:

  • 它也不返回值为 null 的键。它和我做的一样。
  • 您可能在对象中有null keysNameValueCollection 允许重复/空键。否则,这应该可以工作。
  • 键不为空。我将在一分钟内添加 queryDict 的内容
猜你喜欢
  • 2019-11-27
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多