Как мне в C #, используя рекурсию, создавать объекты, ссылаясь на своих родителей? - PullRequest
0 голосов
/ 15 марта 2012

ОБНОВЛЕНИЕ: Первоначальная идея состояла в том, чтобы вложить объекты, но затем я понял, что наличие следа предков в каждом объекте будет достаточно, поэтому в заголовок были внесены изменения.

Я хочусоздать коллекцию объектов, с которыми я могу играть во время разработки (идея будет заключаться в том, чтобы поместить их в коллекцию MongoDB), но не могу понять, как сделать несколько глубин.

Объекты для этогоСценарий имеет только имя, идентификатор (автоинкремент) и строку, разделенную косой чертой, для родительских объектов каждого объекта.

Мне удалось заставить начальную рекурсию работать:

id Имя предка

1 / LFHVJULLCA

2/1 / OHOEKOOFZP

3/1/2 / PIUHBACFJV

4/1/2/3 / PYKUFZOHXS

5/1/2/3/4 / UJFUYENSQV

6/1/2/3/4/5 / SHLMWCKZUJ

7/1/2/3/4/5/ 6 / SFBHLQXTZL

8/1/2/3/4/5/6/7 / AHHHUGDZIX

9/1/2/3/4/5/6/7/8/ MKOODIMYXC

10/1/2/3/4/5/6/7/8/9 / OONOZOHYJH

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

И вот где язастрял.Любые указатели, пожалуйста?

List<Thing> things;
int count;

void Main()
{
    things = new List<Thing>();

    count = 1;
    int depth = 10;
    int thingsPerThing = 3;

    var thing = new Thing{ Ancestors = "/", id = count++, Name = "Name " + count};
    things.Add(thing);

    AddThing(depth, 0, thingsPerThing, thing);

    things.Dump();
}

public class Thing
{
  public int id{get;set;}
  public string Ancestors{ get;set;}
  public string Name{get;set;}
}

public void AddThing( int depth, int CurrentDepth, int thingsPerThing, Thing thing)
{
    CurrentDepth++;
    if( CurrentDepth < depth )
    {
        var newThing = CreateThing(thing);
        things.Add( newThing );
        AddThing( depth--, CurrentDepth, thingsPerThing, newThing);
    }

}

public Thing CreateThing(Thing thing)
{
    return new Thing{ Ancestors = thing.Ancestors + thing.id + "/", id = count++, Name = RandomString(10) };
}

1 Ответ

1 голос
/ 15 марта 2012

Вы должны использовать коллекцию Tree .

Некоторые примеры реализации:
- Обширный анализ структур данных с использованием C # 2.0 (MSDN)
- Реализация недвоичного дерева в C # (блог Дэна Вандербума)
- Общая коллекция деревьев (CodeProject)

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

Если вам нужна более сложная библиотека для сбора, вы можете проверить это:
- Библиотека C5 Generic Collection
- Коллекция энергии Wintellect

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...