如何从 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
,用同样的方法拆分和重建。
不过,更多的字符串操作。
假设以下 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
,用同样的方法拆分和重建。
不过,更多的字符串操作。