如何从NameValueCollection中删除单个实例?

时间:2019-06-25 15:00:49

标签: asp.net vb.net namevaluecollection

假设以下网址:

Dim nvc As NameValueCollection = HttpUtility.ParseQueryString(http://localhost/Index.aspx?A=23&A=7&A=1)

如何从NameValueCollection中删除A的特定实例?

我可以添加其他条目

nvc.Add("A", 10)

但是似乎只能删除所有实例

nvc.Remove("A")

我不希望使用字符串hacks。

2 个答案:

答案 0 :(得分:2)

尝试这种方法,不会滥用字符串操作(我认为)。

该方法提取Query部分,选择指定键的值(除去要删除的值),然后使用UriBuilder.Query属性(可以设置)重建查询,最后返回新的{{1 }},缺少已删除的键值对。

Uri

Dim key As String = "A"
Dim valuesToRemove As String() = {"23", "1"}
Dim loc = New Uri("http://localhost/Index.aspx?A=23&A=7&A=1&B=2&B=4&C=23")

Dim newUri As Uri = UriRemoveKeyValues(loc, key, valuesToRemove)

您也可以只获取 Imports System.Web Private Function UriRemoveKeyValues(uri As Uri, Key As String, Values As String()) As Uri Dim nvc = HttpUtility.ParseQueryString(uri.Query) Dim keyValues = nvc.GetValues(Key).Except(Values).ToList() nvc.Remove(Key) keyValues.ForEach(Sub(s) nvc.Add(Key, s)) Dim builder As New UriBuilder(uri) With { .Query = nvc.ToString() } Return builder.Uri End Function ,以相同的方式拆分和重建。
不过,更多的字符串操作。

答案 1 :(得分:1)

您可以使用GetValues(String)方法来获取值的数组。然后,您可以创建一个新列表或该数组中的任何适当列表,例如:

Dim loc = New Uri("http://localhost/Index.aspx?A=23&A=7&A=1")
Dim nvc As NameValueCollection = HttpUtility.ParseQueryString("&" & loc.Query.TrimStart("?"c))

Dim myValues As New List(Of String)

Dim vals = nvc.GetValues("A")
If vals IsNot Nothing Then
    myValues = vals.Where(Function(v) v <> "7").ToList()
End If

Console.WriteLine(String.Join(vbCrLf, myValues))

输出:

  

23
  1

[我必须对URI进行操作,以获取ParseQueryString来提取第一个“ A”。]