【问题标题】:To check if array consist of only elements from another array, VB.NET要检查数组是否仅包含另一个数组中的元素,VB.NET
【发布时间】:2012-04-12 03:17:09
【问题描述】:

使用具有非常基本的自然语言识别功能的 Visual Basic.NET 控制台应用程序 - 它只需要处理特定的单词字段,因此并不难。我把所有的逻辑都写在纸上,但我遇到了一个问题。

我希望应用程序检查用户输入是否仅包含有效单词。

当用户输入内容时,我使用一个函数将其缩减为只有字母数字字符,并使用 string.split 方法创建一个包含用户输入的单独单词的数组。我现在要做的是将输入数组与另一个数组(完整的有效单词集)进行比较,如果输入数组仅包含有效单词数组中存在的元素,则返回错误消息。

例如,如果所有有效词都是“ALPHA”、“BETA”和“GAMMA”。 当用户输入诸如“ALPHA BETA”之类的内容时,程序将接受输入。 如果输入是“APPLES”,那么它将返回一条错误消息,因为字符串 APPLE 不是有效单词数组的成员。

我希望我的问题已经足够清楚了,请大家帮忙。谢谢。

【问题讨论】:

    标签: vb.net arrays contains


    【解决方案1】:

    在您的情况下,没有必要使用数组作为数据结构。相反,您可以将有效单词列表存储在 System.Collections.Specialized.NameValueCollection 类中。然后,您可以针对存储在System.Collections.Specialized.NameValueCollection 类中的有效单词列表测试每个用户输入。

    如何在System.Collections.Specialized.NameValueCollection类中存储有效单词: 见this

    如何检查System.Collections.Specialized.NameValueCollection类中是否有有效词条目:见this

    【讨论】:

    • 数组是比 NameValueCollection 更简单的数据结构。这个 NameValueCollection 中的“值”到底应该是什么?
    【解决方案2】:

    您可以使用HashSet(T) 来存储您允许的字词。 HashSet.Contains 是 O(1) 操作,而不是其他集合中的 O(n),这使得 HashSet(T) 更有效。

    Private Shared AllowedWords As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase) From
        {
            "Alpha", "Beta", "Gamma"
        }
    
    Public Shared Function WordsAreValid(ParamArray words() As String) As Boolean
        For Each word As String In words
            If Not AllowedWords.Contains(word) Then Return False
        Next
    
        Return True
    End Function
    

    【讨论】:

      【解决方案3】:

      我会使用除 http://msdn.microsoft.com/en-us/library/bb300779.aspx

      Private AllowedWords As String() = {"these", "are", "good", "words"}
      
      Sub Main()
      
          Dim badUserInput As String() = {"these", "are", "bad", "words"}
      
          Dim badWords As IEnumerable(Of String) = badUserInput.Except(AllowedWords)
      
          If badWords.Any Then
              '  User has entered a disallowed word 
              Throw New ArgumentException(String.Format("Words '{0}' are not allowed", String.Join(",", badWords)))
          End If
      
      End Sub
      

      不久前我还写了一篇关于加入收藏的不同方式的博客:

      http://dotnetrene.blogspot.co.uk/2012/01/joining-collections-in-linq-contains-vs.html

      【讨论】:

        【解决方案4】:

        也许您正在寻找类似All() 的方法,它检查集合中的每个元素是否满足条件。考虑以下示例:

        Dim validWords = {"ALPHA", "BETA", "GAMMA"}
        
        Dim thisIsNotValid = {"ALPHA", "APPLES"}.All(Function(word) validWords.Contains(word))
        
        Dim thisIsValid = {"ALPHA", "BETA"}.All(Function(word) validWords.Contains(word))
        

        thisIsNotValid 将评估为 FalsethisIsValid 将评估为 True

        【讨论】:

          猜你喜欢
          • 2021-01-30
          • 2017-03-03
          • 2019-05-05
          • 2022-01-02
          • 2020-11-21
          • 1970-01-01
          相关资源
          最近更新 更多