使用第一个条件搜索多个字符串,然后使用不同的条件搜索这些返回的值,依此类推

时间:2017-09-14 18:39:03

标签: vb.net

所以..

我有一个包含数百个句子或字符串的txt文件。

我还有4个组合框,其中包含用户可以从中选择的选项 每个组合框都是不同选择标准的一部分。他们可能会也可能不会使用所有组合框。

当用户从任何组合框中选择一个选项时,我使用For..Next语句来运行txt文件,并挑选出包含或匹配用户所选内容的所有字符串。然后它显示那些字符串供用户查看,这样如果他们想要,他们可以通过使用剩下的3个组合框来进一步缩小搜索范围,从而更容易找到他们想要的内容。

我可以通过在for循环中使用大量的IF语句来实现这一点,但这是唯一的方法吗?

2 个答案:

答案 0 :(得分:0)

不,还有其他方法。您可以利用LINQ来删除其中的一些if语句:

Private _lstLinesInFile As List(Of String) = New List(Of String)

Private Function AddClause(ByVal qryTarget As IEnumerable(Of String), ByVal strToken As String) As IEnumerable(Of String)

    If Not String.IsNullOrWhiteSpace(strToken) Then

        qryTarget = qryTarget.Where(Function(ByVal strLine As String) strLine.Contains(strToken))

    End If

    Return qryTarget

End Function

Public Sub YourEventHandler()

    'Start Mock
    Dim strComboBox1Value As String = "Test"
    Dim strComboBox2Value As String = "Stack"
    Dim strComboBox3Value As String = String.Empty
    Dim strComboBox4Value As String = Nothing
    'End Mock

    If _lstLinesInFile.Count = 0 Then

        'Only load from the file once.
        _lstLinesInFile = IO.File.ReadAllLines("C:\Temp\Test.txt").ToList()

    End If

    Dim qryTarget As IEnumerable(Of String) = (From strTarget In _lstLinesInFile)

    'Assumes you don't have to match tokens that are split by line breaks.
    qryTarget = AddClause(qryTarget, strComboBox1Value)
    qryTarget = AddClause(qryTarget, strComboBox2Value)
    qryTarget = AddClause(qryTarget, strComboBox3Value)
    qryTarget = AddClause(qryTarget, strComboBox4Value)

    Dim lstResults As List(Of String) = qryTarget.ToList()  

End Sub

请记住,这是区分大小写的,所以你可能想要在那里引入一些.ToLower()调用:

qryTarget = qryTarget.Where(Function(ByVal strLine As String) strLine.ToLower().Contains(strToken.ToLower()))

答案 1 :(得分:0)

我认为复合If语句是最简单的:

Dim strLines() As String = IO.File.ReadAllText(strFilename).Split(vbCrLf)
Dim strSearchTerm1 As String = "Foo"
Dim strSearchTerm2 As String = "Bar"
Dim strSearchTerm3 As String = "Two"
Dim strSearchTerm4 As String = ""
Dim lstOutput As New List(Of String)
For Each s As String In strLines
  If s.Contains(strSearchTerm1) AndAlso
    s.Contains(strSearchTerm2) AndAlso
    s.Contains(strSearchTerm3) AndAlso
    s.Contains(strSearchTerm4) Then
    lstOutput.Add(s)
  End If
Next