Vb.net 如何从文本文件中获取特定项目?Visual Basic 2010

Vb.net 如何从文本文件中获取特定项目?Visual Basic 2010,vb.net,loops,text-files,Vb.net,Loops,Text Files,我试图弄明白如何让消息框只显示文本文件中的特定单词,该文本文件包含字典中的所有单词。我尝试了各种不同的方法,但无法使其发挥作用,但我确实认为我在正确的轨道上,所以只需要一些指针 基本上,有一个加扰的字符串,它每次都不同,并且包含在标签中。我想让程序只显示那些在加扰字符串中包含字母的单词,但不知道如何实现这一点 以下是我目前掌握的代码: Private Sub btnAnswers_Click(ByVal sender As System.Object, ByVal e As System.Eve

我试图弄明白如何让消息框只显示文本文件中的特定单词,该文本文件包含字典中的所有单词。我尝试了各种不同的方法,但无法使其发挥作用,但我确实认为我在正确的轨道上,所以只需要一些指针

基本上,有一个加扰的字符串,它每次都不同,并且包含在标签中。我想让程序只显示那些在加扰字符串中包含字母的单词,但不知道如何实现这一点

以下是我目前掌握的代码:

Private Sub btnAnswers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswers.Click

    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String
    Dim OneCharacter As String
    Dim Found As Boolean
    Dim item As String
    Dim AllCharacters As String

    Found = False
    Letters = lblLetters.Text

    For i = 0 To Letters.Length - 1
        OneCharacter = Letters.Substring(i, 1)
        For Each item In hash
            If item.Contains(OneCharacter) Then
                Found = True
                AllCharacters = OneCharacter
            Else
                Found = False
            End If
            MsgBox(item)
        Next
    Next i
End Sub

消息框确实会显示字典中的单词,但单词可能包含标签字符串中不存在的字母,因此我的代码是错误的。有人能帮忙吗?很抱歉,我对编程一无所知。

您在确定当前单词是否包含当前字符的if语句之外调用了
MsgBox(item)
。这意味着它会出现在每个字母,每个单词上。如果只希望在单词中实际找到字母时显示,请将
MsgBox(item)
移动到if语句的前半部分

我还建议遵循Steven Doggart的建议,改变循环嵌套的方式。如果字符是外循环,则每个单词可以多次显示消息框(例如,如果您的字母是“sdf”,其中一个单词是“foods”,则会弹出3次)


正如Steven Doggart所建议的,必须反转循环嵌套。您需要检查所有字典条目,并检查每个条目是否包含字符串中的所有字母。您的循环结构不允许这样做

我已在您的代码中执行了所需的更新。请记住,此代码忽略caps(“A”与“A”相同)

这段代码查找包含给定标签中所有字符的键(不是相反),也就是说:使用标签“dict”,“dictentry”是正确的


在任何情况下,我的回答的全部要点都不是交付一个只需执行的代码;这段代码的重点是帮助您理解自己做错了什么,以及如何开始做正确的事情。如果你对这个确切的功能不感兴趣,你就必须编辑我的代码,这样你就可以完成你想要的;或者,理想情况下,您可以完全从头开始编写自己的代码。

只需对前面的答案进行简单修改,即可将输出限制为仅包含加扰字母的单词:

Private Sub btnAnswers_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String = lblLetters.Text
    For Each item As String In hash
        Dim word As String = item.ToLower()
        For i = 0 To Letters.Length - 1
            Dim OneCharacter As Char = Char.ToLower(Letters(i))
            While word.Contains(OneCharacter)
                word = word.Remove(word.IndexOf(OneCharacter), 1)
            End While
        Next
        If (word.Length = 0) Then
            'The given dictionary entry includes all the letters in the label. No more iterations will be performed
            MsgBox(item)
            Exit For
        End If
    Next
End Sub

使用此代码,如果加扰的字母包含“bok”,则将选择“book”。但是,删除while循环并只留下remove语句,将确保只有每个不同字母的确切数字匹配。因此,需要使用“obok”来匹配“book”。

您需要循环外部循环中的所有单词(在
哈希中),然后根据内部嵌套循环中的所有搜索字母计算当前单词。这仍然会产生包含标签字符串中不存在的字母的单词:(凯蒂讽刺地说,我现在正在为你写一个评论。我观察到,自从你来到这里以来,你还没有回答过一个问题。老实说,我根本不喜欢这种态度(我认为那些花了很多时间帮助你的人真是忘恩负义),事实上这是违反你的排名的。(因此与你在网站上可以/不能做的事情相反)。如果你不介意的话,在继续回答你的问题之前,我想知道更多关于这一点:为什么你从来没有奖励过答案?@Katie(我仍在寻找你对我上一个问题的答案)澄清一下:这段代码寻找的是一个包含标签中所有字母的字典键,即dictionary key=“dictkey”和label=“dict”;“dictkey”是有效的。如果你想得到字典键,它只包含标签的字母,也就是说,相同的单词,但包含字符,最终以不同的顺序排列(上述示例中的“dictkey”是错误的);代码必须修改。我期待您对我的两个问题的回答。我道歉,我非常感谢,如果您查看以前的问题,我会给人们评分并留下评论,表示感谢他们的帮助。再次抱歉,我将继续改进。好的,谢谢您的帮助,抱歉,我显得忘恩负义我惹你生气了。@Katie惹我生气了?!哈哈,这是不可能的。我直截了当地说是为了避免误解,但我一点也不生气。我只是说我所看到的(和我所想的):没有一个问题被授予。另外,请看一看我的最新答案。除了删除,我认为她想要的只是从字典中选择单词,它的所有字符都包含在标签中,也就是说,如果标签是“dictionary”(或“dictionayr”),那么“dictionary”就可以了.这是我至少理解的。我想我已经帮了大忙,因此不会改变我的答案:一切为了你。从OP上说的,如果标签是“字典”,她不想要“字典”,因为“e”和“s”不在原始字符串中。完全正确。您的代码提供了功能,但激发了功能,而不是检索现有条目。我认为她想要的是定位“Dictionars”在文本文件中,如果没有,则不会返回任何内容。但是,请看……这不是我的问题:询问她到底想要什么。它会检索现有项目。如果字符串足够短,并且可以找到多个与该字符串匹配的项目,则无法确定哪个项目是正确的。没有人说它是y我们的问题。我在回答中只考虑了代码的基础。谢谢@tinstaafl。如果我的描述不清楚,我很抱歉。标签字符串的示例可以是CYUIALT,标签中的单词可以是“
Private Sub btnAnswers_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String = lblLetters.Text
    For Each item As String In hash
        Dim Found As Boolean = True
        For i = 0 To Letters.Length - 1
            Dim OneCharacter As String = Letters.Substring(i, 1)
            Dim itemToLower As String = item.ToLower()
            If Not itemToLower.Contains(OneCharacter.ToLower()) Then
                Found = False
                Exit For
            End If
        Next i
        If (Found) Then
            'The given dictionary entry includes all the letters in the label. No more iterations will be performed
            MsgBox(item)
            Exit For
        End If
    Next
End Sub
Private Sub btnAnswers_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String = lblLetters.Text
    For Each item As String In hash
        Dim word As String = item.ToLower()
        For i = 0 To Letters.Length - 1
            Dim OneCharacter As Char = Char.ToLower(Letters(i))
            While word.Contains(OneCharacter)
                word = word.Remove(word.IndexOf(OneCharacter), 1)
            End While
        Next
        If (word.Length = 0) Then
            'The given dictionary entry includes all the letters in the label. No more iterations will be performed
            MsgBox(item)
            Exit For
        End If
    Next
End Sub