Невозможно получить доступ к данным из списка (списка) - PullRequest
0 голосов
/ 11 июля 2019

Я работаю над надстройкой Revit, и в этой надстройке я пытаюсь использовать List(Of List(Of Curve)), однако у меня проблема с доступом к данным из подсписков.

Dim ClosedCurveList As New List(Of List(Of Curve))
Dim ClosedCurve As new List (Of Curve)

For i=0 To FinalWallLines.Count-1
    If FinalWallLines(i+1).GetEndPoint(0).X = FinalWallLines(i).GetEndPoint(1).X And _
       FinalWallLines(i+1).GetEndPoint(0).Y = FinalWallLines(i).GetEndPoint(1).Y And _
       FinalWallLines(i+1).GetEndPoint(0).Z = FinalWallLines(i).GetEndPoint(1).Z Then

        ClosedCurve.Add(FinalWallLines(i))

    Else

        TaskDialog.Show("A",ClosedCurve.Count)
        ClosedCurveList.Add(ClosedCurve)
        TaskDialog.Show("B", ClosedCurveList(ClosedCurveList.Count-1).Count)
        ClosedCurve.Clear()

    End if
Next

TaskDialog.Show("C", ClosedCurveList.Count)

For i=0 To ClosedCurveList.Count-1
    TaskDialog.Show(i,ClosedCurveList(i).Count)
next

Поэтому, когда я запускаю этот код, первый TaskDialog.Show("A",ClosedCurve.Count) показывает мне, что все ClosedCurve состоят из 4 кривых, что имеет смысл, так как все мои кривые образуют прямоугольники.

Мой второй TaskDialog.Show("B", ClosedCurveList(ClosedCurveList.Count-1).Count) также возвращает 4 в качестве числа для каждого из подсписков, как и ожидалось.

Мой третий TaskDialog.Show("C", ClosedCurveList.Count) возвращает 23.

Итак, из этого мы можем сделать вывод, что ClosedCurveList - это список из 23 списков из 4 кривых.

Однако, во время моего цикла For i=0 To ClosedCurveList.Count-1, мой TaskDialog.Show(i,ClosedCurveList(i).Count) возвращает 23 0s.

Кто-нибудь знает, почему я не получаю 23 4s, как ожидалось, при попытке получить доступ к счетчику каждого из моих подсписков?

1 Ответ

1 голос
/ 11 июля 2019

Вместо ClosedCurve.Clear() у вас должно быть ClosedCurve = new List(Of Curve).

Когда вы добавляете его в ClosedCurveList, вы не добавляете копию. Вы добавляете ссылку на объект CLosedCurve. И поэтому, когда вы очищаете ClosedCurve, он также очищает тот, который был добавлен в ClosedCurveList, потому что они являются ссылками на один и тот же объект. Переназначив новый List(Of Curve) на ClosedCurve, вы получите отдельные ссылки, как вы и ожидали.

...