Как удалить один экземпляр из коллекции NameValueCollection? - PullRequest
0 голосов
/ 25 июня 2019

Принимая следующий URL:

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

Как удалить конкретный экземпляр A из коллекции NameValueCollection?

Я могу добавить дополнительную запись

nvc.Add("A", 10)

Но может показаться, что удаляются только все экземпляры

nvc.Remove("A")

Я бы предпочел не использовать хаки строк.

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Попробуйте этот метод, манипулирование строками не злоупотребляет (я думаю).

Метод извлекает часть запроса, выбирает значения указанного ключа, кроме значений для удаления, затем перестраивает запрос, используя свойство UriBuilder.Query (которое можно установить), и, наконец, возвращает новый сформировано 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

Вы также можете просто получить Uri.Query, разделить и перестроить таким же образом.
Тем не менее, больше манипуляций со строками.

1 голос
/ 25 июня 2019

Вы можете использовать метод 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 * * +1010

[Мне пришлось сделать это с URI, чтобы получить ParseQueryString для извлечения первого «A».]

...