Заполнить вложенную коллекцию ObservableCollection - PullRequest
0 голосов
/ 27 июля 2011

У меня есть класс

public class Owner
{
public int OwnerId{get; set;}
public int OwnerName{get; set;}
public ObservableCollection<Owner> SubOwner{get; set;}
}

Данные, возвращаемые из БД:

Owner_Id           Owner_Parent_Id

1                       null

2                        1

3                        1

4                        3

5                        3

6                        4

7                        6

Мне нужно заполнить свою переменную ObservableCollection Owner указанными выше данными (например, древовидной структурой) .Помощь справкия.

1 Ответ

0 голосов
/ 27 июля 2011

Если я вас правильно понимаю, вы хотите узнать, как построить недвоичное дерево из идентификатора владельца и идентификатора родителя владельца, которые вы получаете из базы данных.Для этого вам нужно отдельно отслеживать корень дерева (экземпляр Owner).Затем вы добавляете API для добавления нового владельца в дерево, которое вызывается только в корне дерева.Этот API рекурсивно обходит дерево, пока не найдет правильного родителя для добавления.Вы также можете упорядочить дерево так, чтобы оно выполнялось быстрее, чем поиск по каждому узлу.

Вот хороший учебник по созданию дерева в C #.

Однако, в вашем простом примере выше я бы не рекомендовал дерево.Я бы порекомендовал добавить parentID в свой класс Owner, а затем использовать простой SortedList,Затем вы можете легко найти идентификатор, получить его родителя и пройти , как если бы у вас было дерево.Например:

void WalkUpTree(SortedList<int, Owner> tree, Owner node)
{
    // (do something with node)

    // process parent
    if (node.parentID == 0 || tree.ContainsKey(node.parentID) == false)
        return;    // No parent
    WalkUpTree(tree, tree[node.parentID]);
}

Если вы хотите пройти вниз по дереву, сохраните индекс корневого узла, а затем создайте второй SortedListгде int является родительским идентификатором, а не идентификатором.Затем WalkUpTree становится WalkDownTree с использованием второго SortedList.

...