首页 > 解决方案 > 在文本框 VB.Net 中调用子

问题描述

获取声明既定金额总和的所有组合

我设法将编写的代码转换为 C#,我需要一些帮助。我不知道如何让他们在我的文本框中显示适当的值。

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' Call (Main) - How to call in a Textbox1.Text
    End Sub

代码:

Class SurroundingClass
    Private Sub Main()
        Dim numbers As Integer() = {3, 9, 8, 4, 5, 7, 10}
        Dim target As Integer = 15
        sum_up(New List(Of Integer)(numbers.ToList()), target)
    End Sub

    Private Shared Sub sum_up_recursive(ByVal numbers As List(Of Integer), ByVal target As Integer, ByVal part As List(Of Integer))
        Dim s As Integer = 0

        For Each x As Integer In part
            s += x
        Next

        If s = target Then
            Console.WriteLine("sum(" & String.Join(",", part.[Select](Function(n) n.ToString()).ToArray()) & ")=" + target)
        End If

        If s >= target Then
            Return
        End If

        For i As Integer = 0 To numbers.Count - 1
            Dim remaining = New List(Of Integer)()
            Dim n As Integer = numbers(i)

            For j As Integer = i + 1 To numbers.Count - 1
                remaining.Add(numbers(j))
            Next

            Dim part_rec = New List(Of Integer)(part)
            part_rec.Add(n)
            sum_up_recursive(remaining, target, part_rec)
        Next
    End Sub

    Private Shared Sub sum_up(ByVal numbers As List(Of Integer), ByVal target As Integer)
        sum_up_recursive(numbers, target, New List(Of Integer)())
    End Sub
End Class

标签: vb.net

解决方案


当您运行代码时,您会看到它在行中一次输出一组结果Console.WriteLine("sum(" & String.Join(",", part.[Select](Function(n) n.ToString()).ToArray()) & ")=" + target)

由于您想一次性获得结果集,因此您需要在该点累积它们而不是写入控制台,并且 Sub 需要是一个具有另一个参数的累加器参数的函数。

进行这些修改:

Public Class Form1

    ' Derived from the code at https://stackoverflow.com/questions/4632322/finding-all-possible-combinations-of-numbers-to-reach-a-given-sum

    Function SumUpRecursive(numbers As List(Of Integer), target As Integer, part As List(Of Integer), solutions As List(Of List(Of Integer))) As List(Of List(Of Integer))
        Dim s = part.Sum()

        If s = target Then
            ' MsgBox("sum(" & String.Join(",", part.[Select](Function(n) n.ToString()).ToArray()) & ")=" & target)
            solutions.Add(part)
        End If

        If s >= target Then
            Return Nothing
        End If

        For i As Integer = 0 To numbers.Count - 1
            Dim remaining = New List(Of Integer)()
            Dim n As Integer = numbers(i)

            For j As Integer = i + 1 To numbers.Count - 1
                remaining.Add(numbers(j))
            Next

            Dim part_rec = New List(Of Integer)(part)
            part_rec.Add(n)
            SumUpRecursive(remaining, target, part_rec, solutions)

        Next

        Return solutions

    End Function


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim numbers As Integer() = {3, 9, 8, 4, 5, 7, 10}
        Dim target As Integer = 15
        Dim nums = SumUpRecursive((numbers.ToList()), target, New List(Of Integer), New List(Of List(Of Integer)))

        If nums Is Nothing Then
            MsgBox("Failure :(")
        Else
            MsgBox(String.Join(vbCrLf, nums.Select(Function(b) String.Join(", ", b))))
            ' TextBox1.Lines = nums.Select(Function(b) String.Join(", ", b)).ToArray()
        End If

    End Sub

End Class

我相信有一种更简洁的书写方式。


推荐阅读