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

How to remove a single instance from a NameValueCollection?

假设以下 url:

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")

我不想使用字符串黑客。

您可以使用 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"。]

试试这个方法,字符串操作没有被滥用(我认为)。

该方法提取Query部分,选择指定Key的值除要删除的值,然后使用UriBuilder.Query 属性(可设置)重建Query,最后返回新形成的 Uri,缺少删除的 Key-Value 对。

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

你也可以只得到Uri.Query,用同样的方法拆分和重建。
不过,更多的字符串操作。