检查一个字符串是否包含所有其他字符串

Check if a string contains all other strings

我正在尝试编写一个软件的一部分,我试图在其中显示符合搜索条件的结果。

我有一个文本框,我可以在其中键入一个或多个要搜索的词,还有一个包含 4 个不同列和十几行的列表视图。这个想法是每个列表视图行都包含很多单词,我只想查看包含我在文本框中键入的所有单词的行。我已经完成了只搜索一个术语的代码。我遇到的问题是我不完全理解如何做同样的事情,而是使用多个术语而不是一个术语。

在文本框中,我用 space 分隔我要搜索的词。我有一个变量,我将列表视图行的全部内容用 : 分隔(示例 => col1row1content:col1row2content:col1row3content,等等)。总而言之,我想检查一个字符串(一行的全部内容)是否包含所有其他字符串(我在文本框中输入的每个单词)。

这是我实现的代码:

Dim textboxFullContentArray As String() = textboxSearch.Split(New Char() {" "c})
Dim Content As String
Dim containsAll As Boolean = False
Dim wholeRowContent(listviewMain.Items.Count - 1) As String ' each index of the array keeps the entire row content (one array contains all 4 cells of the row)



' wholeRowContent contains in one index the entire content of a row. That means, 
' the index contains the 4 cells that represent an entire row. 
' The format is like "rowData1:rowData2:rowData3:rowData4" (omitted for simplicity)
    For Q As Integer = 0 To listviewMain.Items.Count - 1
        For Each Content In textboxFullContentArray
            If wholeRowContent(Q).ToLower.Contains(Content) Then
                containsAll = True
                ' rest of the code...
            ElseIf Not wholeRowContent(Q).ToLower.Contains(Content) Then
                containsAll = False
                Exit For
            End If
        Next
    Next

当然,这段代码显示误报,我认为这不是一个好的解决方案。我认为它一定更容易,我把这个概念过于复杂了。

我正在使用 VB.Net 2013

您的 If/Else 看起来可以简化。我会在嵌套循环外将您的 containsAll 值设置为 true,并且只有当您在 "textboxFullContentArray" 中遇到 wholeRowContent(Q) 中未包含的 "Content" 时,您才将 containsAll 设置为 false,否则什么也不做。

此外,查看正在发生的事情的一种方法是打印包含在整个函数中比较的值的语句,您可以通读这些语句并查看在运行时发生误报时发生了什么。

您可以通过一行代码确定String是否包含所有子字符串列表:

If substrings.All(Function(s) str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0) Then

请注意,我实际上实现了不区分大小写的比较,而不是使用 ToLowerToUpper

调用 IndexOf 而不是 Contains 似乎不太整洁,但你猜怎么着:Contains 实际上在内部调用 IndexOf

public bool Contains(string value)
{
    return this.IndexOf(value, StringComparison.Ordinal) >= 0;
}

如果您想要不区分大小写的 Contains 方法,您可以编写自己的扩展方法:

<Extension>
Public Function Contains(source As String,
                         value As String,
                         comparisonType As StringComparison) As Boolean
    Return source.IndexOf(value, comparisonType) >= 0
End Function

在寻找一个简单有效的解决方案(并尝试不同的代码)几个小时后,我终于找到了我改编自的这个解决方案:Bad word filter - Whosebug

For Q As Integer = 0 To listviewMain.Items.Count - 1
    If textboxFullContentArray.All(Function(b) wholeRowContent(q).ToLower().Contains(b.ToLower())) Then
    ' my code
    End If
Next