2013-02-20 4 views
1

Я пытаюсь заполнить многомерный массив, который будет поддерживать следующие рекурсивные отношения (DATA поступает из таблицы базы данных).Заполнение многомерного массива (рекурсивное отношение) из запроса

Этот многомерный массив будет использоваться для создания списка ниже. У меня есть минимальный опыт работы с многомерными массивами в VB.NET. Любая помощь будет принята с благодарностью. Если вы считаете, что есть лучший способ достичь этого, дайте мне знать.

DATA

ID  NAME    PARENTID 
10  Bobby Brown   50   
20  Dave Matthew  80 
30  Sergey Boostad  50 
40  Linda View   50 
50  Bill Lumberg   
60  Rina Gina   50 
70  Ben Thompson  100 
80  Maria Tree   50 
90  Gustav Duffield  80 
100  Jon Theodore   
110  Cedric Loomis  100 
120  Jeremy Oscar  100 

OUTPUT (для достижения)

[50] - Bill Lumberg 
    [10] - Bobby Brown 
    [30] - Sergey Boostad 
    [40] - Linda View 
    [60] - Rina Gina 
    [80] - Maria Tree 
     [20] - Dave Matthew 
     [90] - Gustav Duffield 
[100] - Jon Theodore  
    [70] - Ben Thompson 
    [110] - Cedric Loomis  
    [120] - Jeremy Oscar 
+1

Было бы более целесообразным использовать пользовательский класс с этими свойствами или 'DataTable'. –

+0

Согласовано. Означает ли это * HAVE * многомерный массив? Если нет, я бы настоятельно рекомендовал против этого. –

+0

Тим. Я могу легко помещать данные в DataTable, но как я могу построить рекурсивную связь (требуется выход)? Я попытался использовать класс DataRelation, но он будет обрабатывать только одно отношение (один уровень). DataRelation: http://msdn.microsoft.com/en-us/library/system.data.datarelation.aspx –

ответ

2

Чтобы сохранить дерево в памяти, вы можете создать класс вроде этого:

Public Class NameNode 
    Public Sub New(name As String) 
     Me.Name = name 
    End Sub 

    Public Property Name As String 
    Public Level As Integer 
    Public Property Children As New List(Of NameNode) 
End Class 

Затем, вы можете используйте его следующим образом:

Dim bill As New NameNode("Bill Lumberg") 
bill.Children.Add(New NameNode("Bobby Brown") 
bill.Children.Add(New NameNode("Sergey Boostad") 

Чтобы заполнить ее из плоской DataSet, вам нужно сделать рекурсивный метод, например:

Public Function BuildNode(data As DataSet, nameId As Integer, level As Integer), As NameNode 
    Dim node As New NameNode() 
    node.Level = level 
    ' Find name with the ID in the dataset and set the node's name property accordingly 
    Dim childIds As New List(Of Integer) 
    ' Search Get a list of all the name ID's that have the current ID as their parent 
    For Each i As Integer In childIds 
     node.Children.Add(BuildNode(data, i, level + 1)) 
    Next 
    Return node 
End Function 

Тогда вы могли бы построить всю ветку Билл LUMBERG, называя его так:

Dim bill As NameNode = BuildNode(data, 50, 0) 
+0

Спасибо, Стивен. Я адаптирую ваше решение с помощью своего набора данных. Было бы легко добавить уровень в NameNode? Например, «Bill Lumberg» будет уровнем «0» –

+0

Да, это легко сделать. Я обновил свой пример, чтобы показать, как это можно сделать. –

+0

Спасибо, Стивен. Все еще пытаюсь адаптировать мой код, чтобы он работал с вашим решением. В очередной раз благодарим за помощь. –