假设以下网址:
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。
答案 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”。]