Чтобы проверить, состоит ли массив только из элементов другого массива, VB.NET - PullRequest
2 голосов
/ 28 марта 2012

Работа с консольным приложением Visual Basic.NET, которое имеет ОЧЕНЬ ОСНОВНУЮ функцию распознавания естественного языка - оно должно работать только с определенными полями слов, так что это не так сложно. Я понял всю логику на бумаге, но столкнулся с проблемой.

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

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

Например, если все допустимые слова - "АЛЬФА", "БЕТА" и "ГАММА". Когда использование вводит что-то вроде «ALPHA BETA» - программа примет ввод. Если вход «APPLES», он вернет сообщение об ошибке, потому что строка APPLE не является членом массива допустимых слов.

Надеюсь, я достаточно ясно изложил свой вопрос, всем, пожалуйста, помогите. Спасибо.

Ответы [ 4 ]

3 голосов
/ 28 марта 2012

Возможно, вы ищете что-то вроде 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 будет оцениваться до False, а thisIsValid будет оцениваться до True.

2 голосов
/ 28 марта 2012

Я бы использовал, кроме, 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

1 голос
/ 29 марта 2012

В вашем случае нет необходимости использовать массив в качестве структуры данных. Вместо этого вы можете сохранить свой список допустимых слов в классе System.Collections.Specialized.NameValueCollection. Затем вы можете проверить каждый пользовательский ввод по списку допустимых слов, которые хранятся в System.Collections.Specialized.NameValueCollection классе.

Как сохранить действительное слово в System.Collections.Specialized.NameValueCollection классе: Смотрите это .

Как проверить правильность ввода слова в System.Collections.Specialized.NameValueCollection классе: см. this

1 голос
/ 29 марта 2012

Вы можете использовать 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
...