用Do While循环循环类属性

时间:2019-02-18 17:19:25

标签: vb.net while-loop do-while

我有如下代码,找到名为“ Model”的类别属性,此后,我将获得模型的名称。

但是您可以看到“ parent”属性显示了参数的上层。我在参数组中的参数及其级联。而且我不知道他们目前在哪个级别上使用以下代码,但这还不够,因为如果我在较低级别上有一个参数,则必须编写elseif条件。

是否有任何快速的解决方案可以使它变得更简单,更明智?

Public Class ParameterInfoClass
    Public Shared Sub GetSubvar(ByVal ParameterGroups As IScrNamedObjectList)
        Dim ParameterGroup As IScrParameterGroup
        Dim nParameterGroup As Integer
        Dim ParameterClass As String
        nParameterGroup = ParameterGroups.count
        For i As Integer = 0 To nParameterGroup - 1
            ParameterGroup = ParameterGroups.item(i)
            If ParameterGroup.parent.category.name = "Model" Then
                ParameterClass = ParameterGroup.parent.name
            ElseIf ParameterGroup.parent.parent.category.name = "Model" Then
                ParameterClass = ParameterGroup.parent.parent.name
            ElseIf ParameterGroup.parent.parent.parent.category.name = "Model" Then
                ParameterClass = ParameterGroup.parent.parent.parent.name
                '...
                'This should be continue like this because i don't know in which level i will find the category name as "Model"
                '.
            End If
            DataGridView1.Rows.Add(ParameterClass, ParameterGroup.name)
        Next
    End Sub
End Class

使用正确的解决方案来制作此部分非常好。我以为“ do-while循环”可能是一种选择,但我不知道如何应用,因为在写模型的名称之后,重点是在这里查找上层参数以查找“模型”类别。

For i As Integer = 0 To nParameterGroup - 1
            ParameterGroup = ParameterGroups.item(i)
            If ParameterGroup.parent.category.name = "Model" Then
                ParameterClass = ParameterGroup.parent.name
            ElseIf ParameterGroup.parent.parent.category.name = "Model" Then
                ParameterClass = ParameterGroup.parent.parent.name
            ElseIf ParameterGroup.parent.parent.parent.category.name = "Model" Then
                ParameterClass = ParameterGroup.parent.parent.parent.name
                '...
                'This should be continue like this because i don't know in which level i will find the category name as "Model"
                '.
            End If

1 个答案:

答案 0 :(得分:1)

我没有太多时间去研究细节,但是递归是我喜欢的东西,所以我给你一个提示(我会提供更多帮助,但是那是我现在的时间)。

您应该创建一个简单的递归函数,而不是遍历每个可能的父级,而该函数将查找是否找到"Model",然后返回它,或者通过调用自身来寻找它的父级。

您将不得不使用此新函数,而不是If ElseIf ElseIf...可能无限的函数。

我起草了一些看起来像我的意思的东西:

Private Function GetParameterClass(rootClassName As rootClass) As String
    If ParameterGroup.category.name = "Model" Then
        Return ParameterGroup.category.name
    End If
    If ParameterGroup.parent IsNot Nothing Then
        Return GetParameterClass(ParameterGroup.parent)
    End If

    Return ""
End Function

通过调用类似的函数,您将递归遍历每个父对象,直到没有找到为止,并且在第一次找到"Model"时,它将停止递归并返回它。

抱歉,我的工作不够精确,我必须重新开始工作!如果可以的话,我将在今晚视察您的线程。玩得开心!

编辑:

我对您正在使用的课程不熟悉,因此此编辑中有很多猜测。这是我尝试解决您的问题的方法:

Public Class ParameterInfoClass
    Public Shared Sub GetSubvar(ByVal ParameterGroups As IScrNamedObjectList)
        For Each parameterGroup As IScrParameterGroup In ParameterGroups
            Dim parameterClass As String = GetParameterClassName(parameterGroup)

            If parameterName <> "" Then
                DataGridView1.Rows.Add(parameterClass, parameterGroup.Name)
            End If
        Next
    End Sub

    Private Shared Function GetParameterClassName(parameterGroup As IScrParameterGroup) As String
        If parameterGroup.category.name = "Model" Then
            Return parameterGroup.name
        End If
        If parameterGroup.parent IsNot Nothing Then
            Return GetParameterClass(parameterGroup.parent)
        End If

        Return ""
    End Function
End Class

GetParameterClassName背后的主要思想是它将找到parameterGroup.category.name = "Model",否则将返回一个空字符串。我用For Each循环替换了您计划进行迭代的方式,该循环应该可以在大多数列表中很好地工作,但是您可能需要调整一下IScrNamedObjectList是否不包含或不包含列表或数组之类的东西。

只要找到GetParameterClassName,那么parameterClass就不会为空,因此我们可以将这些信息添加到DataGridView1中。

如果有任何疑问,您可以在评论中提出您的问题,我们很乐意为您服务。我喜欢递归!