如何检查一个字符串是否包含其他字符串的所有字符(以任何顺序)?

时间:2019-05-27 19:37:50

标签: vb.net winforms visual-studio-2013 string-comparison

我将尝试举例说明我要解决的问题。我认为这是解释问题的最好方法。

我有一个“ 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

我已经写了一些代码,但是我编写得不好,因为当原始字符串(较低值的文本框)包含重复的数字时,它接受无效的值。没有重复的值时,效果很好。

我尝试了不同的代码,但发现了一个链接,该链接似乎可以解决我的问题,但我不知道它是如何工作的。 Check if a string contains all other strings

我尝试过的代码是:



        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 :(得分:0)

您可以验证组成起始值的有序数字序列在[StartNumber] - [EndNumber]范围内的任何数字中是否具有对应关系。

给出此值范围:

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

比较范围内每个生成的值的顺序,如果匹配则将其添加到List(Of Integer)中。
最后找到的所有匹配项将添加到列表框。

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