如何检查字符串列表中是否找到子字符串

时间:2018-03-16 15:08:19

标签: vb.net dictionary

我有一个字典,其键值(字符串类型)如下:

  • 标记
  • 标记
  • mark b
  • apple
  • apple a

我还有一个List(Of String),其中包含:

  • 标记
  • 苹果

我想删除Dictionary中的任何条目,其中List中的任何值都是Dictionary项的键的子字符串。

在上面的示例中,具有以下键的条目将从Dictionary中删除:

  • 标记
  • 标记
  • mark b
  • apple
  • apple a

如何在没有多个循环的情况下从词典中过滤和删除这些条目?

以下是我尝试过的示例代码/伪代码:

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)循环来完成任务。有没有更好的方法/更简洁的代码来完成它?

4 个答案:

答案 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)