Свойство класса Looping с циклом Do While - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть код, подобный приведенному ниже, чтобы найти свойство категории с именем «Модель», и после этого я получу имя модели.

Но, как видите, свойство parent указывает верхний уровень параметра.Мои параметры в группах параметров и тому подобное каскадные.И я не знаю, на каком уровне они находятся в данный момент, я использую приведенный ниже код, но этого недостаточно, потому что если у меня есть параметр очень низкого уровня, я должен был написать это в других условиях.

Есть ли какие-нибудь быстрыерешение, чтобы сделать это проще и мудрее?

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 голосов
/ 18 февраля 2019

У меня не так много времени, чтобы копаться в деталях, но рекурсия - это то, что мне нравится, поэтому я даю вам подсказку (я помог бы больше, но сейчас у меня есть время).

Вместо того, чтобы перебирать каждый возможный родительский уровень, вы должны создать простую рекурсивную функцию, которая будет искать, находит ли она "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.

Вы можете задать свои вопросы в комментариях, если у вас естьлюбой, и я буду счастлив, чтобы обязать.Я люблю рекурсию!

...