我正在尝试对软件的一部分进行编码,以尝试显示与搜索条件匹配的结果。
我有一个文本框,可以在其中键入要搜索的一个或多个单词,以及一个包含4个不同列和12行的列表视图。这个想法是每个listview行包含很多单词,我只想查看包含我在文本框中键入的所有单词的行。我已经完成了仅搜索一个术语的代码。我遇到的问题是我不完全了解该怎么做,而是使用多个术语而不是仅一个术语。
在文本框中,我要搜索的单词用空格隔开。我有一个变量,其中列表视图行的整个内容由:分隔(示例=> 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
答案 0 :(得分:2)
您可以确定String
是否包含仅一行代码的所有子字符串列表:
If substrings.All(Function(s) str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0) Then
请注意,我实际上已经实现了不区分大小写的比较,而不是使用ToLower
或ToUpper
。
调用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
答案 1 :(得分:0)
您的If / Else看起来可以简化。我将在嵌套循环之外将containsAll值设置为true,并且仅当遇到“ textboxFullContentArray”中未包含在“ wholeRowContent(Q)中”的“内容”时,将containsAll设置为false,否则什么也不做。
此外,查看发生情况的一种方法是打印带有在整个函数中进行比较的值的语句,您可以阅读这些语句并查看运行时发生误报的情况。
答案 2 :(得分:0)
经过几个小时的寻找简单有效的解决方案(并尝试使用不同的代码),我终于找到了我改编自的解决方案:Bad word filter - stackoverflow
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