LINUX.ORG.RU

Простая реализация дерева в C#

 ,


0

1

Имеется код, который заполняет элементы TreeView (используется только экземпляр TreeNodeCollection).

Все не-листовые узлы имеют только строковое имя.

Все строковые узлы имеют имя, а так же данные (объекты одного и того же типа, хранящие только данные), хранящиеся в св-ве Tag.

Этот процесс должен быть разбит на 2 части:

1. Заполнение древовидной структуры данных 2. Заполнение TreeView на основании данных этой структуры

Для пункта 1 требуется реализация простейшей древовидной структуры данных, которая выглядит как TreeNodeCollection (методы Add и коллекция Nodes ).

И, самое главное:

В листовых узлах нужно так же пользовательские данные (Экземпляр одного и того же класса MyOwnClass)

Нужно для загрузки/представления в памяти следующей JSON-структуры:

topLevelItem: {
   subItem: {
      field1: val1,
      field2: val2
   }
},
oneLevelItem: {
    field1: val1,
    field2: val2
}

Зы. В MSDN не посылать. Был там. Везде используют Left и Right.

Зы. зы. В университете был. Сабж учил. Методичске сожжены. С проподом в однклассниках не контачу. На экзамене такое темы не было.

В последний раз дерево пришлось применять 20 лет назад. На лекции в тетрадку записывал.

Так, а в чем проблема-то? Дерево построить? Вот это должно придумываться и писаться за две минуты, не больше.

class Tree<T>
{
	private readonly List<Node<T>> _roots = new List<Node<T>>();
	
	public IReadOnlyList<Node<T>> Roots => _roots;
	
	public void AddRoot(Node<T> root)
	{
		_roots.Add(root);
	}
}

class Node<T>
{
	private readonly List<Node<T>> _children = new List<Node<T>>();
	private readonly Node<T> _parent;
	
	public Node(T value, Node<T> parent)
	{
		Value = value;
		_parent = parent;
	}
	
	public T Value { get; set; }
	
	public IReadOnlyList<Node<T>> Children => _children;
	
	public Node<T> Parent => _parent;
	
	public bool IsRoot => _parent == null;
	
	public bool IsLeaf => _children.Count == 0;
	
	public void AddChild(Node<T> node)
	{
		_children.Add(node);
	}
}
BlackHawk
()
Ответ на: комментарий от EnterpriseMobility

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

BlackHawk
()
Ответ на: комментарий от BlackHawk

твое дерево - строго типизированное.

Оно хранит в каждом узле одно и то же значение T.

Мне нужно T только на листьях.

На всех узлах - строки.

EnterpriseMobility
() автор топика
Ответ на: комментарий от EnterpriseMobility

Ну так добавь еще одно свойство к нодам, и на узлах заполняй только строки, а на листьях только Т. В чем проблема то?

Int0l ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.