要检查数组是不是仅包含另一个数组中的元素,VB.NET

Posted

技术标签:

【中文标题】要检查数组是不是仅包含另一个数组中的元素,VB.NET【英文标题】: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 不是有效单词数组的成员。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于要检查数组是不是仅包含另一个数组中的元素,VB.NET的主要内容,如果未能解决你的问题,请参考以下文章

检查数组是不是包含另一个数组的所有元素

检查数组是不是包含另一个数组及其在 DART/Flutter 中的位置

检查一个数组是不是包含 JavaScript 中另一个数组的任何元素

检查一个数组是不是包含 JavaScript 中另一个数组的任何元素

检查一个数组是不是包含另一个数组的所有元素

核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配