我有一个字典,其键值(字符串类型)如下:
我还有一个List(Of String),其中包含:
我想删除Dictionary中的任何条目,其中List中的任何值都是Dictionary项的键的子字符串。
在上面的示例中,具有以下键的条目将从Dictionary中删除:
如何在没有多个循环的情况下从词典中过滤和删除这些条目?
以下是我尝试过的示例代码/伪代码:
For Each whatKVP In whatDict
If IsSubstringFoundInAList(whatKVP.Key, listName) = True Then
listKeyDel.Add(whatKVP.Key)
End If
Next
For Each whatKey In listKeyDel
whatDict.Remove(whatKey)
Next
Private Function IsSubstringFoundInAList(ByVal strIp As String, ByVal listStr As List(Of String)) As Boolean
Dim whatStr As String
For Each whatStr In listStr
If strIp.Contains(whatStr) = True Then
Return True
End If
Next
Return False
End Function
在上面的代码中,我需要使用很多(3)循环来完成任务。有没有更好的方法/更简洁的代码来完成它?
答案 0 :(得分:1)
你可以使用List.Any()在我看来看起来更干净
Dim findString = "foo"
listOfString.Any(Function(stringInList)
Return stringInList.Equals(findString)
End Function)
如果您正在寻找性能,则建议使用Linq
答案 1 :(得分:1)
您可以在一个声明中执行此操作。以下假定whatDict
是您的字典,listName
是您的关键子字符串列表。
whatDict = whatDict.Where(Function(kvp) Not listName.Any(Function(n) kvp.Key.Contains(n))) _
.ToDictionary(Function(kvp) kvp.Key, Function(kvp) kvp.Value)
这将创建一个新的Dictionary,其中仅包含现有Dictionary中的KeyValuePairs,其中该键不包含listName
中的任何子字符串。
答案 2 :(得分:1)
你需要这样的东西。我使用'StartsWith',但你可以改为'包含'
Dim outList As New List(Of String)
outList.Add("mark")
outList.Add("apple")
whatDict = whatDict.Where(Function(x) Not outList.Exists(Function(y) x.Key.StartsWith(y))).ToDictionary(Function(x) x.Key, Function(x) x.Value)
答案 3 :(得分:0)
这个功能可以解决问题:
Public Function FilterDictionary(Of T, K)(Dictionary As IDictionary(Of T, K), FilterList As ICollection(Of T)) As IDictionary(Of T, k)
Return (From Item In Dictionary
Where Not FilterList.Any(Function(x) Item.Key.ToString.Contains(x.ToString))).
ToDictionary(Function(x) x.Key, Function(x) x.Value)
End Function
用法:
Dim MyDictionary As New Dictionary(Of String, Integer)
Dim FilterList As New List(Of String)
'Fill Collections...
Dim FilteredDictionary = FilterDictionary(MyDictionary, FilterList)