Как проверить, содержит ли строка все символы (в любом порядке) из другой строки? - PullRequest
0 голосов
/ 27 мая 2019

Я собираюсь привести пример того, что я пытаюсь решить. Я думаю, что это лучший способ объяснить проблему.

У меня есть цикл for, который генерирует числа от X до Y. X - это нижнее значение диапазона, который я ввожу в текстовое поле, а Y - это верхнее значение из этого диапазона. Например: От 1234 до 4321

Итак, программа генерирует значения от 1234 до 4321 -> 1234,1235,1236, ..., 4320,4321. Для I = 1234 до 4321

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

Lower value textbox = 12344
Generated values:
12344 -> valid because it contains 12344
12395 -> not valid because '5' is not contained in 12344
...
44231 -> valid because it contains 12344
41243 -> valid because it contains 12344

Я написал некоторый код, но я плохо его кодирую, потому что он принимает недопустимые значения, когда исходная строка (текстовое поле с более низким значением) содержит повторяющиеся числа. Хорошо работает, когда нет повторяющихся значений.

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

Код, который я пробовал:



        Dim StartNumber As Integer = TextBox_InitialDigit.Text
        Dim FinalNumber As Integer = TextBox_FinalDigit.Text

        Dim AmountOfResults As Integer

        Dim StringOriginal As String = TextBox_InitialDigit.Text

        Dim ArraySubstrings As Char() = StringOriginal.ToCharArray()

        Dim ContainsAll = False


        For I = Convert.ToInt32(TextBox_InitialDigit.Text) To Convert.ToInt32(TextBox_FinalDigit.Text)

            For Each Character In ArraySubstrings
                If I.ToString.Contains(Character) Then
                    ContainsAll = True
                ElseIf Not I.ToString.Contains(Character) Then
                    ContainsAll = False
                    Exit For
                End If
            Next

            If ContainsAll = True Then
                ListBox1.Items.Add(I)
                AmountOfResults += 1
            End If

        Next

        Label_AmountOfResults.Text = "Total results: " & AmountOfResults

Приведенный выше код, как я объяснил, работает нормально, если исходная строка (та, которую я печатаю в текстовом поле) не содержит повторяющихся чисел.

Я чувствую, что то, что я пытаюсь сделать, чрезвычайно просто реализовать, но я просто упускаю это. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 28 мая 2019

Вы можете проверить, соответствует ли упорядоченная последовательность чисел, составляющих начальное значение, любому из чисел в диапазоне [StartNumber] - [EndNumber].

Учитывая этот диапазон значений:

Dim startNum As Integer = 21434
Dim endNum As Integer = 41350

Сравните последовательность каждого сгенерированного значения в диапазоне и добавьте его к List(Of Integer), если это совпадение.
Все совпадениянайденный будет добавлен в ListBox в конце.

Dim startNChars As Char() = startNum.ToString().ToCharArray().OrderBy(Function(n) n).ToArray()
Dim validResults As New List(Of Integer)()
For i As Integer = startNum + 1 To endNum
    If i.ToString().ToCharArray().OrderBy(Function(n) n).SequenceEqual(startNChars) Then
        validResults.Add(i)
    End If
Next

ListBox1.DataSource = validResults
...