2013-10-09 164 views
0

我在VB.net中有幾個數組。這些數組有不同的長度,我需要它們之間的組合。簡單的解決方案是使用嵌套循環如在例如:在vb.net中獲得數組數組的所有可能組合

Dim Array1= {10, 11, 12} 
Dim Array2= {15} 
Dim Array3= {1,2,3} 
Dim array(2) As Object 
array(0) = Array1 
array(1) = Array2 
array(2) = Array3 

for (a = 1 to < Array1.Length - 1) 
    for (b = 1 to < Array2.Length - 1) 
     for (c = 1 to < Array3.Length - 1)    
      'Get combination 
      Next 
     Next 
Next 

Output: {10,15,1},{10,15,2},{10,15,3},{11,15,1},{11,15,2},... 

但是,真正的問題是,陣列的數量是不固定的參數(可以是3如實施例中或任何其它數目),因此嵌套循環不是解決方案。

有什麼想法?

+0

你是說輸入的是一個數組的數組?像交錯的二維數組或數組的集合? –

+0

不完全清楚這裏要問什麼。 –

回答

0

這裏有一個快速重寫了我幾乎十年前寫的一些代碼,同時仍然使用VB.Net 2003 ...我的硬盤上有什麼美好的回憶!

希望你找到它的輸出有用:

10,15,1 
10,15,2 
10,15,3 
11,15,1 
11,15,2 
11,15,3 
12,15,1 
12,15,2 
12,15,3 

生成它的代碼:

Public Class Form1 

    Private WithEvents FC As ArrayCombinations = Nothing 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     If IsNothing(FC) Then 
      FC = New ArrayCombinations 
      FC.AddArray(New Integer() {10, 11, 12}) 
      FC.AddArray(New Integer() {15}) 
      FC.AddArray(New Integer() {1, 2, 3}) 
      FC.GenerateCombos() 
     End If 
    End Sub 

    Private Sub FC_combinations(combos As System.Collections.Generic.List(Of System.Collections.Generic.List(Of Integer))) Handles FC.Combinations 
     For Each combo As List(Of Integer) In combos 
      Debug.Print(String.Join(",", combo.Select(Function(i) i.ToString()))) 
     Next 
     FC = Nothing 
    End Sub 

End Class 

Public Class ArrayCombinations 

    Private Arrays As New List(Of Integer()) 
    Private WithEvents BGW As New System.ComponentModel.BackgroundWorker 
    Public Event Combinations(ByVal combos As List(Of List(Of Integer))) 

    Public Sub New() 
     BGW.WorkerReportsProgress = True 
    End Sub 

    Public Sub AddArray(ByVal values() As Integer) 
     If Not BGW.IsBusy Then 
      Arrays.Add(values) 
     End If 
    End Sub 

    Public Sub GenerateCombos() 
     If Not BGW.IsBusy Then 
      BGW.RunWorkerAsync() 
     End If 
    End Sub 

    Private Sub BGW_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork 
     Dim sizes As New List(Of Integer) 
     Dim combinations As Integer 
     Dim remainder As Integer 
     Dim quotient As Integer 
     Dim combination As List(Of Integer) 
     Dim combos As New List(Of List(Of Integer)) 

     If Arrays.Count > 0 Then 
      combinations = 1 
      For Each factor() As Integer In Arrays 
       sizes.Add(factor.Count) 
       combinations = combinations * factor.Count 
      Next 

      For i As Integer = 0 To combinations - 1 
       combination = New List(Of Integer) 
       For j As Integer = 1 To Arrays.Count 
        combination.Add(Nothing) 
       Next 

       quotient = i \ sizes.Item(sizes.Count - 1) ' Integer Division 
       remainder = i Mod sizes.Item(sizes.Count - 1) 

       combination(Arrays.Count - 1) = Arrays.Item(Arrays.Count - 1)(remainder) 
       For j As Integer = (sizes.Count - 2) To 0 Step -1 
        combination.Item(j) = Arrays.Item(j)(quotient Mod sizes.Item(j)) 
        quotient = quotient \ sizes.Item(j) ' Integer Division 
       Next 
       combos.Add(combination) 
      Next 

      e.Result = combos 
     End If 
    End Sub 

    Private Sub BGW_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGW.RunWorkerCompleted 
     RaiseEvent Combinations(e.Result) 
    End Sub 

End Class 
0

您可以創建一個列表來保存所有的陣列的組合值,然後按這些值回一個數組,像這樣:

Dim listCombined = New List(Of Integer) 
listCombined.AddRange(array1) 
listCombined.AddRange(array2) 
listCombined.AddRange(array3) 

Dim arrayCombined As Integer() = listCombined.ToArray() 

注:此示例假設你有整型數組,但你可以將類型更改爲陣列實際保存的任何類型。您還可以循環訪問數組,而不是逐個爲列表調用AddRange