Проверьте, содержит ли строка все остальные строки

Я пытаюсь закодировать часть программного обеспечения, в которой я пытаюсь показать результаты, соответствующие критериям поиска.

У меня есть текстовое поле, в котором я могу ввести одно или несколько слов, которые я хочу найти, и список, содержащий 4 разных столбца и дюжину строк. Идея состоит в том, что каждая строка списка содержит много слов, и я хочу видеть только те строки, которые содержат все слова, которые я ввел в текстовое поле. Я закончил код, который ищет только один термин. Проблема, с которой я столкнулся, заключается в том, что я не совсем понимаю, как сделать то же самое, но использовать несколько терминов вместо одного.

В текстовом поле я пишу слова, которые хочу найти, через пробел. У меня есть переменная, в которой я сохраняю все содержимое строки списка, разделенное символом : (пример => 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


person Richard Steele    schedule 27.07.2018    source источник


Ответы (3)


Вы можете определить, содержит ли 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
person jmcilhinney    schedule 28.07.2018

Ваш If / Else выглядит так, как будто его можно упростить. Я бы установил для вашего значения containsAll значение true вне вложенных циклов, и только если вы встретите «Content» в «textboxFullContentArray», который не содержится в wholeRowContent (Q), которое вы установили для containsAll в false, иначе ничего не делайте.

Кроме того, один из способов увидеть, что происходит, - это напечатать операторы со значениями, которые сравниваются по всей вашей функции, которые вы можете прочитать и увидеть, что происходит во время выполнения, когда возникают ложные срабатывания.

person Alexandra    schedule 27.07.2018

После нескольких часов поиска простого и эффективного решения (и пробования разных кодов) я наконец нашел это решение, которое я адаптировал из: Фильтр недопустимых слов - overflow на русском

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
person Richard Steele    schedule 28.07.2018