0

ユーザーが文字列を入力するための4つのテキストボックスが順番にあります。文字列にカンマが含まれている場合、それはスピルされます。文字列ごとに、ダッシュを使用して次の文字列と連結します。この問題を視覚化するには:

Dim str1 = "A1,A2"
Dim str2 = "2,3"
Dim str3 = "4A,4B"
Dim str4 = "7,8"

フォーマット:str1& "-"&str2& "-"&str3& "-"&str4

出力は(昇順で)次のようになります。

{"A1-2-4A-7", "A1-2-4A-8", "A1-2-4B-7", "A1-2-4B-8",
"A1-3-4A-7", "A1-3-4A-8", "A1-3-4B-7", "A1-3-4B-8",
"A2-2-4A-7", "A2-2-4A-8", "A2-2-4B-7", "A2-2-4B-8",
"A2-3-4A-7", "A2-3-4A-8", "A2-3-4B-7", "A2-3-4B-8"}

カンマがない場合は、単一の文字列として扱われます。

私はなんとか上記の結果を達成することができました:

Private Sub GenerateString(ByVal str1 As String, ByVal str2 As String, ByVal str3 As String, ByVal str4 As String)
    Dim arr1 As New List(Of String)
    Dim arr2 As New List(Of String)
    Dim arr3 As New List(Of String)
    Dim arr4 As New List(Of String)

    SpliString(str1, arr1)
    SpliString(str2, arr2)
    SpliString(str3, arr3)
    SpliString(str4, arr4)

    Dim arrMain As New ArrayList

    arrMain.Add(arr1)
    arrMain.Add(arr2)
    arrMain.Add(arr3)
    arrMain.Add(arr4)

    Dim listCom As New List(Of String)
    For Each tempList As List(Of String) In arrMain
        If tempList.Count > 0 Then
            If listCom.Count = 0 Then
                listCom.AddRange(tempList)
            Else
                Dim listTemp As New List(Of String)
                listTemp.AddRange(listCom)
                listCom.Clear()
                For Each tempStrMain As String In listTemp
                    For Each tempStr As String In tempList
                        listCom.Add(tempStrMain & "-" & tempStr)
                    Next
                Next
            End If
        End If
    Next

    Return listCom
End Function

Private Sub SpliString(ByVal strToSplit As String, ByRef arrString As List(Of String))
    If Not strToSplit = "" Then
        If strToSplit.Contains(",") Then
            Dim splitArr() As String = strToSplit.Split(",")

            For Each str As String In splitArr
                arrString.Add(str)
            Next
        Else
            arrString.Add(strToSplit)
        End If
    End If
End Sub

今私の質問は、文字列のグループで文字列を並べ替えるにはどうすればよいですか?たとえば、str3が一番上で選択された文字列のグループである場合、次のようになります。

出力は(3番目の文字列グループによって)次のようになります。

"A1-2-4A-7", "A1-2-4A-8", "A1-3-4A-7", "A1-3-4A-8", 
"A2-2-4A-7", "A2-2-4A-8", "A2-3-4A-7", "A2-3-4A-8",
"A1-2-4B-7", "A1-2-4B-8", "A1-3-4B-7", "A1-3-4B-8",
"A2-2-4B-7", "A2-2-4B-8", "A2-3-4B-7", "A2-3-4B-8"

str4がソートするために選択されたグループである場合、出力:

"A1-2-4A-7", "A1-2-4B-7", "A1-3-4A-7", "A1-3-4B-7", 
"A2-2-4A-7", "A2-2-4B-7", "A2-3-4A-7", "A2-3-4B-7",
"A1-2-4A-8", "A1-2-4B-8", "A1-3-4A-8", "A1-3-4B-8",
"A2-2-4A-8", "A2-2-4B-8", "A2-3-4A-8", "A2-3-4B-8"

DataTable、ArrayList、IComparerを使用するようなメソッドはありますか?また、GenerateStringコードを書き直すためのより良い方法はありますか?n個の入力(現在は4としてハードコーディングされています)もサポートするのに十分な動的なコードがあれば、より良いでしょう。

4

1 に答える 1

0

これがあなたの答えに対する私の最初の試みです。残念ながら、まだ動的ではありません。LINQとそのクロス結合機能を使用して、回答を取得します。

  Private Sub btnMiscTest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnMiscTest.Click
    Dim str1 As String = "A1,A2"
    Dim str2 As String = "2,3"
    Dim str3 As String = "4A,4B"
    Dim str4 As String = "7,8"

    'Add the strings into a list
    Dim multiString As New List(Of String)
    multiString.Add(str1)
    multiString.Add(str2)
    multiString.Add(str3)
    multiString.Add(str4)

    Dim resultStrings As List(Of String) = GenerateString(multiString, 3)
  End Sub


  Private Function GenerateString(ByVal multiString As List(Of String), ByVal sortIndex As Integer) As List(Of String)
    'Split each string into a list of strings and add it to a "StringOfStrings" list
    Dim tmpStringOfStrings As New List(Of List(Of String))
    For Each tmpString As String In multiString
      Dim tmpSubString As List(Of String) = tmpString.Split(",").ToList
      tmpStringOfStrings.Add(tmpSubString)
    Next
    'Use LINQ to do a Cross Apply and sort by index
    Dim resultList As List(Of String) = (From s0 As String In tmpStringOfStrings(0) _
                                         From s1 As String In tmpStringOfStrings(1) _
                                         From s2 As String In tmpStringOfStrings(2) _
                                         From s3 As String In tmpStringOfStrings(3) _
                                         Order By If(sortIndex = 0, s0, _
                                                  If(sortIndex = 1, s1, _
                                                  If(sortIndex = 2, s2, s3))) _
                                         Select s0 & "-" & s1 & "-" & s2 & "-" & s3).ToList
    Return resultList
  End Function
于 2012-08-15T13:36:26.820 に答える